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();