@@ -81,25 +81,15 @@ func (router *NetworkRouter) Start() {
81
81
82
82
func (router * NetworkRouter ) handleCapturedPacket (key PacketKey ) FlowOp {
83
83
router .PacketLogging .LogPacket ("Captured" , key )
84
- srcMac := net .HardwareAddr (key .SrcMAC [:])
85
- dstMac := net .HardwareAddr (key .DstMAC [:])
86
84
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 )
97
86
98
87
// Discard STP broadcasts
99
88
if key .DstMAC == [... ]byte {0x01 , 0x80 , 0xC2 , 0x00 , 0x00 , 0x00 } {
100
89
return DiscardingFlowOp {}
101
90
}
102
91
92
+ dstMac := net .HardwareAddr (key .DstMAC [:])
103
93
switch dstPeer := router .Macs .Lookup (dstMac ); dstPeer {
104
94
case router .Ourself .Peer :
105
95
// The packet is destined for a local MAC. The bridge
@@ -123,6 +113,11 @@ func (router *NetworkRouter) handleCapturedPacket(key PacketKey) FlowOp {
123
113
}
124
114
125
115
func (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
+
126
121
if key .DstPeer != router .Ourself .Peer {
127
122
// it's not for us, we're just relaying it
128
123
router .PacketLogging .LogForwardPacket ("Relaying" , key )
@@ -133,21 +128,11 @@ func (router *NetworkRouter) handleForwardedPacket(key ForwardPacketKey) FlowOp
133
128
// (because the DstPeer on a forwarded broadcast packet is
134
129
// always set to the peer being forwarded to)
135
130
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 )
148
132
149
133
router .PacketLogging .LogForwardPacket ("Injecting" , key )
150
134
injectFop := router .Bridge .InjectPacket (key .PacketKey )
135
+ dstMac := net .HardwareAddr (key .DstMAC [:])
151
136
dstPeer := router .Macs .Lookup (dstMac )
152
137
if dstPeer == router .Ourself .Peer {
153
138
return injectFop
@@ -168,6 +153,21 @@ func (router *NetworkRouter) handleForwardedPacket(key ForwardPacketKey) FlowOp
168
153
}
169
154
}
170
155
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
+
171
171
// Routing
172
172
173
173
func (router * NetworkRouter ) relay (key ForwardPacketKey ) FlowOp {
0 commit comments