From b2ea164c76a04ce6e9aeb73768f7770114013eb1 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 3 Nov 2017 14:06:46 +0100 Subject: [PATCH] nic_router: fix bugs in DHCP client functionality Ref #2560 --- repos/os/src/server/nic_router/dhcp_client.cc | 7 ++++++- repos/os/src/server/nic_router/interface.cc | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/repos/os/src/server/nic_router/dhcp_client.cc b/repos/os/src/server/nic_router/dhcp_client.cc index 60656c14b..2d422834d 100644 --- a/repos/os/src/server/nic_router/dhcp_client.cc +++ b/repos/os/src/server/nic_router/dhcp_client.cc @@ -88,7 +88,9 @@ void Dhcp_client::_handle_timeout(Duration) void Dhcp_client::handle_ip(Ethernet_frame ð, size_t eth_size) { - if (eth.dst() != _interface.router_mac()) { + if (eth.dst() != _interface.router_mac() && + eth.dst() != Mac_address(0xff)) + { throw Packet_ignored("DHCP client expects Ethernet targeting the router"); } Ipv4_packet &ip = *new (eth.data()) @@ -109,6 +111,9 @@ void Dhcp_client::handle_ip(Ethernet_frame ð, size_t eth_size) if (dhcp.op() != Dhcp_packet::REPLY) { throw Packet_ignored("DHCP client expects DHCP reply"); } + if (dhcp.client_mac() != _interface.router_mac()) { + throw Packet_ignored("DHCP client expects DHCP targeting the router"); + } try { _handle_dhcp_reply(dhcp); } catch (Dhcp_packet::Option_not_found) { throw Packet_ignored("DHCP client misses DHCP option"); diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc index b67406a3a..3890e5fe5 100644 --- a/repos/os/src/server/nic_router/interface.cc +++ b/repos/os/src/server/nic_router/interface.cc @@ -836,11 +836,16 @@ void Interface::_handle_eth(void *const eth_base, catch (Ethernet_frame::No_ethernet_frame) { error("invalid ethernet frame"); } - catch (Interface::Bad_network_protocol) { + catch (Bad_network_protocol) { if (_config().verbose()) { log("unknown network layer protocol"); } } + catch (Packet_ignored exception) { + if (_config().verbose()) { + log("Packet ignored: ", exception.reason); + } + } catch (Ipv4_packet::No_ip_packet) { error("invalid IP packet"); }