mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:58:11 +00:00
Kernel: Properly support the SO_BROADCAST socket option
POSIX requires that broadcast sends will only be allowed if the SO_BROADCAST socket option was set on the socket. Also, broadcast sends to protocols that do not support broadcast (like TCP), should always fail.
This commit is contained in:
parent
8b2beb2ebe
commit
545f4b6cc1
7 changed files with 36 additions and 6 deletions
|
@ -178,7 +178,7 @@ static MACAddress multicast_ethernet_address(IPv4Address const& address)
|
|||
return MACAddress { 0x01, 0x00, 0x5e, (u8)(address[1] & 0x7f), address[2], address[3] };
|
||||
}
|
||||
|
||||
RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, RefPtr<NetworkAdapter> const through, AllowUsingGateway allow_using_gateway)
|
||||
RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, RefPtr<NetworkAdapter> const through, AllowBroadcast allow_broadcast, AllowUsingGateway allow_using_gateway)
|
||||
{
|
||||
auto matches = [&](auto& adapter) {
|
||||
if (!through)
|
||||
|
@ -291,8 +291,11 @@ RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, R
|
|||
// If it's a broadcast, we already know everything we need to know.
|
||||
// FIXME: We should also deal with the case where `target_addr` is
|
||||
// a broadcast to a subnet rather than a full broadcast.
|
||||
if (target_addr == 0xffffffff && matches(adapter))
|
||||
return { adapter, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };
|
||||
if (target_addr == 0xffffffff && matches(adapter)) {
|
||||
if (allow_broadcast == AllowBroadcast::Yes)
|
||||
return { adapter, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };
|
||||
return { nullptr, {} };
|
||||
}
|
||||
|
||||
if (adapter == NetworkingManagement::the().loopback_adapter())
|
||||
return { adapter, adapter->mac_address() };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue