Skip to content
This repository was archived by the owner on Jun 20, 2024. It is now read-only.

Commit 2636132

Browse files
committed
Extract common parts and move to learnMAC
The function updates the MAC cache and invalidates routes if needed.
1 parent 73e8258 commit 2636132

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

router/network_router.go

+24-24
Original file line numberDiff line numberDiff line change
@@ -81,25 +81,15 @@ func (router *NetworkRouter) Start() {
8181

8282
func (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

125115
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+
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

173173
func (router *NetworkRouter) relay(key ForwardPacketKey) FlowOp {

0 commit comments

Comments
 (0)