@@ -81,25 +81,15 @@ func (router *NetworkRouter) Start() {
8181
8282func (router * NetworkRouter ) handleCapturedPacket (key PacketKey ) FlowOp {
8383 router .PacketLogging .LogPacket ("Captured" , key )
84- srcMac := net .HardwareAddr (key .SrcMAC [:])
85- dstMac := net .HardwareAddr (key .DstMAC [:])
8684
87- switch newSrcMac , conflictPeer := router .Macs .Add (srcMac , router .Ourself .Peer ); {
88- case newSrcMac :
89- log .Print ("Discovered local MAC " , srcMac )
90- case conflictPeer != nil :
91- // The MAC cache has an entry for the source MAC associated
92- // with another peer. This can happen when a MAC has moved.
93- log .Print ("Discovered local MAC " , srcMac , " (was at " , conflictPeer , ")" )
94- // We need to clear out any flows with the MAC as the source.
95- router .Overlay .(NetworkOverlay ).InvalidateRoutes ()
96- }
85+ router .learnMAC (key , router .Ourself .Peer )
9786
9887 // Discard STP broadcasts
9988 if key .DstMAC == [... ]byte {0x01 , 0x80 , 0xC2 , 0x00 , 0x00 , 0x00 } {
10089 return DiscardingFlowOp {}
10190 }
10291
92+ dstMac := net .HardwareAddr (key .DstMAC [:])
10393 switch dstPeer := router .Macs .Lookup (dstMac ); dstPeer {
10494 case router .Ourself .Peer :
10595 // The packet is destined for a local MAC. The bridge
@@ -123,6 +113,11 @@ func (router *NetworkRouter) handleCapturedPacket(key PacketKey) FlowOp {
123113}
124114
125115func (router * NetworkRouter ) handleForwardedPacket (key ForwardPacketKey ) FlowOp {
116+ if key .SrcPeer == router .Ourself .Peer {
117+ // Might happen when a MAC has moved immediately after sending a packet.
118+ log .Warning ("Detected loop at " , router .Ourself .Peer , " (" , key , ")" )
119+ }
120+
126121 if key .DstPeer != router .Ourself .Peer {
127122 // it's not for us, we're just relaying it
128123 router .PacketLogging .LogForwardPacket ("Relaying" , key )
@@ -133,21 +128,11 @@ func (router *NetworkRouter) handleForwardedPacket(key ForwardPacketKey) FlowOp
133128 // (because the DstPeer on a forwarded broadcast packet is
134129 // always set to the peer being forwarded to)
135130
136- srcMac := net .HardwareAddr (key .SrcMAC [:])
137- dstMac := net .HardwareAddr (key .DstMAC [:])
138-
139- switch newSrcMac , conflictPeer := router .Macs .Add (srcMac , key .SrcPeer ); {
140- case newSrcMac :
141- log .Print ("Discovered remote MAC " , srcMac , " at " , key .SrcPeer )
142- case conflictPeer != nil :
143- log .Print ("Discovered remote MAC " , srcMac , " at " , key .SrcPeer , " (was at " , conflictPeer , ")" )
144- // We need to clear out any flows destined to the MAC
145- // that forward to the old peer.
146- router .Overlay .(NetworkOverlay ).InvalidateRoutes ()
147- }
131+ router .learnMAC (key .PacketKey , key .SrcPeer )
148132
149133 router .PacketLogging .LogForwardPacket ("Injecting" , key )
150134 injectFop := router .Bridge .InjectPacket (key .PacketKey )
135+ dstMac := net .HardwareAddr (key .DstMAC [:])
151136 dstPeer := router .Macs .Lookup (dstMac )
152137 if dstPeer == router .Ourself .Peer {
153138 return injectFop
@@ -168,6 +153,21 @@ func (router *NetworkRouter) handleForwardedPacket(key ForwardPacketKey) FlowOp
168153 }
169154}
170155
156+ func (router * NetworkRouter ) learnMAC (key PacketKey , srcPeer * mesh.Peer ) {
157+ srcMac := net .HardwareAddr (key .SrcMAC [:])
158+
159+ switch newSrcMac , conflictPeer := router .Macs .Add (srcMac , srcPeer ); {
160+ case newSrcMac :
161+ log .Print ("Discovered MAC " , srcMac , " at " , srcPeer )
162+ case conflictPeer != nil :
163+ // If it's a local MAC, then the MAC cache has an entry for the source
164+ // MAC associated with another peer. This can happen when a MAC has moved.
165+ log .Print ("Discovered MAC " , srcMac , " at " , srcPeer , " (was at " , conflictPeer , ")" )
166+ // We need to clear out any flows with the MAC as the source.
167+ router .Overlay .(NetworkOverlay ).InvalidateRoutes ()
168+ }
169+ }
170+
171171// Routing
172172
173173func (router * NetworkRouter ) relay (key ForwardPacketKey ) FlowOp {
0 commit comments