From 4caffd79db507583632d07ca73978a877991a950 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 11 Apr 2019 21:33:57 +0200 Subject: [PATCH] Ethernet multicast support at nic_bridge Fix #3282 --- repos/os/include/net/mac_address.h | 8 +++++++- repos/os/src/server/nic_bridge/packet_handler.cc | 8 ++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/repos/os/include/net/mac_address.h b/repos/os/include/net/mac_address.h index ccd140f40..2975c3a47 100644 --- a/repos/os/include/net/mac_address.h +++ b/repos/os/include/net/mac_address.h @@ -17,6 +17,12 @@ /* OS includes */ #include -namespace Net { using Mac_address = Net::Network_address<6, ':', true>; } +namespace Net { struct Mac_address; } + +struct Net::Mac_address : Net::Network_address<6, ':', true> +{ + using Net::Network_address<6, ':', true>::Network_address; + bool multicast() const { return addr[0] & 1; } +}; #endif /* _NET__MAC_ADDRESS_H_ */ diff --git a/repos/os/src/server/nic_bridge/packet_handler.cc b/repos/os/src/server/nic_bridge/packet_handler.cc index 67d5cd8a0..e5515062c 100644 --- a/repos/os/src/server/nic_bridge/packet_handler.cc +++ b/repos/os/src/server/nic_bridge/packet_handler.cc @@ -61,8 +61,12 @@ void Packet_handler::_link_state() void Packet_handler::broadcast_to_clients(Ethernet_frame *eth, Genode::size_t size) { - /* check whether it's really a broadcast packet */ - if (eth->dst() == Ethernet_frame::broadcast()) { + /* + * For simplicity reasons, we broadcast all multicast packets not only the + * special multicast case "broadcast". (The broadcast address also has the + * multicast bit set on Ethernet). + */ + if (eth->dst().multicast()) { /* iterate through the list of clients */ Mac_address_node *node = _vlan.mac_list.first();