From 64ac7745fec17dafe1c75a38f2999d43bba0e76e Mon Sep 17 00:00:00 2001 From: David Wragg Date: Mon, 25 May 2015 21:38:55 +0100 Subject: [PATCH] Don't inspect the DF flag earlier than we need to --- router/forwarder.go | 5 +++++ router/local_peer.go | 16 ++++++++-------- router/router.go | 13 +++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/router/forwarder.go b/router/forwarder.go index da727034..cab1c0ff 100644 --- a/router/forwarder.go +++ b/router/forwarder.go @@ -77,6 +77,11 @@ func (conn *LocalConnection) Forward(df bool, frame *ForwardedFrame, dec *Ethern conn.Log("Cannot forward frame yet - awaiting contact") return nil } + + if dec != nil { + df = dec.DF() + } + // We could use non-blocking channel sends here, i.e. drop frames // on the floor when the forwarder is busy. This would allow our // caller - the capturing loop in the router - to read frames more diff --git a/router/local_peer.go b/router/local_peer.go index 3be1e7b5..930fbf1b 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -28,15 +28,15 @@ func NewLocalPeer(name PeerName, nickName string, router *Router) *LocalPeer { return peer } -func (peer *LocalPeer) Forward(dstPeer *Peer, df bool, frame []byte, dec *EthernetDecoder) error { - return peer.Relay(peer.Peer, dstPeer, df, frame, dec) +func (peer *LocalPeer) Forward(dstPeer *Peer, frame []byte, dec *EthernetDecoder) error { + return peer.Relay(peer.Peer, dstPeer, frame, dec) } -func (peer *LocalPeer) Broadcast(df bool, frame []byte, dec *EthernetDecoder) { - peer.RelayBroadcast(peer.Peer, df, frame, dec) +func (peer *LocalPeer) Broadcast(frame []byte, dec *EthernetDecoder) { + peer.RelayBroadcast(peer.Peer, frame, dec) } -func (peer *LocalPeer) Relay(srcPeer, dstPeer *Peer, df bool, frame []byte, dec *EthernetDecoder) error { +func (peer *LocalPeer) Relay(srcPeer, dstPeer *Peer, frame []byte, dec *EthernetDecoder) error { relayPeerName, found := peer.router.Routes.Unicast(dstPeer.Name) if !found { // Not necessarily an error as there could be a race with the @@ -50,20 +50,20 @@ func (peer *LocalPeer) Relay(srcPeer, dstPeer *Peer, df bool, frame []byte, dec log.Println("Unable to find connection to relay peer", relayPeerName) return nil } - return conn.(*LocalConnection).Forward(df, &ForwardedFrame{ + return conn.(*LocalConnection).Forward(false, &ForwardedFrame{ srcPeer: srcPeer, dstPeer: dstPeer, frame: frame}, dec) } -func (peer *LocalPeer) RelayBroadcast(srcPeer *Peer, df bool, frame []byte, dec *EthernetDecoder) { +func (peer *LocalPeer) RelayBroadcast(srcPeer *Peer, frame []byte, dec *EthernetDecoder) { nextHops := peer.router.Routes.Broadcast(srcPeer.Name) if len(nextHops) == 0 { return } for _, conn := range peer.ConnectionsTo(nextHops) { - err := conn.(*LocalConnection).Forward(df, &ForwardedFrame{ + err := conn.(*LocalConnection).Forward(false, &ForwardedFrame{ srcPeer: srcPeer, dstPeer: conn.Remote(), frame: frame}, diff --git a/router/router.go b/router/router.go index 67d7b239..a85d1fb1 100644 --- a/router/router.go +++ b/router/router.go @@ -169,7 +169,6 @@ func (router *Router) handleCapturedPacket(frameData []byte, dec *EthernetDecode if found && dstPeer == router.Ourself.Peer { return } - df := dec.DF() router.LogFrame("Forwarding", frameData, dec) // at this point we are handing over the frame to forwarders, so @@ -182,11 +181,11 @@ func (router *Router) handleCapturedPacket(frameData []byte, dec *EthernetDecode // If we don't know which peer corresponds to the dest MAC, // broadcast it. if !found { - router.Ourself.Broadcast(df, frameCopy, dec) + router.Ourself.Broadcast(frameCopy, dec) return } - err := router.Ourself.Forward(dstPeer, df, frameCopy, dec) + err := router.Ourself.Forward(dstPeer, frameCopy, dec) if ftbe, ok := err.(FrameTooBigError); ok { err = dec.sendICMPFragNeeded(ftbe.EPMTU, po.WritePacket) } @@ -312,15 +311,13 @@ func (router *Router) handleUDPPacketFunc(relayConn *LocalConnection, dec *Ether return } - df := dec.DF() - if dstPeer != router.Ourself.Peer { // it's not for us, we're just relaying it router.LogFrame("Relaying", frame, dec) - err := router.Ourself.Relay(srcPeer, dstPeer, df, frame, dec) + err := router.Ourself.Relay(srcPeer, dstPeer, frame, dec) if ftbe, ok := err.(FrameTooBigError); ok { err = dec.sendICMPFragNeeded(ftbe.EPMTU, func(icmpFrame []byte) error { - return router.Ourself.Forward(srcPeer, false, icmpFrame, nil) + return router.Ourself.Forward(srcPeer, icmpFrame, nil) }) } @@ -342,7 +339,7 @@ func (router *Router) handleUDPPacketFunc(relayConn *LocalConnection, dec *Ether dstPeer, found = router.Macs.Lookup(dstMac) if !found || dstPeer != router.Ourself.Peer { router.LogFrame("Relaying broadcast", frame, dec) - router.Ourself.RelayBroadcast(srcPeer, df, frame, dec) + router.Ourself.RelayBroadcast(srcPeer, frame, dec) } } }