From 3656bf7594ac3e459a8a3c9df19aeb2ac23d7e48 Mon Sep 17 00:00:00 2001 From: Russell Mull Date: Wed, 19 Mar 2025 08:21:31 -0700 Subject: [PATCH] Handle broadcast packets in switch Previously, all packets with unknown destination MAC addresses were broadcast to all other interfaces. With this change, only packets addressed to the broadcast MAC address will be broadcast. `EnableBroadcastUnknown` was added to revert to the previous behavior, in case it is desired. --- .../Extensions/Tools/Network/Switch.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Emulator/Extensions/Tools/Network/Switch.cs b/src/Emulator/Extensions/Tools/Network/Switch.cs index 0dc9ed749..1338cd028 100644 --- a/src/Emulator/Extensions/Tools/Network/Switch.cs +++ b/src/Emulator/Extensions/Tools/Network/Switch.cs @@ -113,6 +113,22 @@ public void DisablePromiscuousMode(IMACInterface iface) } } + public void EnableBroadcastUnknown() + { + lock (innerLock) + { + broadcastUnknown = true; + } + } + + public void DisableBroadcastUnknown() + { + lock (innerLock) + { + broadcastUnknown = false; + } + } + public void Start() { Resume(); @@ -147,7 +163,7 @@ private void ForwardToReceiver(EthernetFrame frame, IMACInterface sender) { var interestingIfaces = macMapping.TryGetValue(frame.DestinationMAC, out var destIface) ? ifaces.Where(x => (x.PromiscuousMode && x.Interface != sender) || x.Interface == destIface) - : ifaces.Where(x => x.Interface != sender); + : ifaces.Where(x => (frame.DestinationMAC.IsBroadcast || broadcastUnknown) && x.Interface != sender); if(!TimeDomainsManager.Instance.TryGetVirtualTimeStamp(out var vts)) { @@ -180,6 +196,7 @@ private void ForwardToReceiver(EthernetFrame frame, IMACInterface sender) } private bool started = true; + private bool broadcastUnknown = false; private readonly object innerLock = new object(); private readonly HashSet ifaces = new HashSet();