From b77abf480b8e45a6cda1600cb3516208bc687db0 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Mon, 25 May 2015 20:45:29 +0100 Subject: [PATCH] Move DF indication into LogFrame --- router/ethernet_decoder.go | 4 ++++ router/router.go | 19 +++++-------------- weaver/main.go | 14 ++++++++++---- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/router/ethernet_decoder.go b/router/ethernet_decoder.go index 8fe65ebb..555ce033 100644 --- a/router/ethernet_decoder.go +++ b/router/ethernet_decoder.go @@ -74,3 +74,7 @@ func (dec *EthernetDecoder) IsSpecial() bool { return dec.Eth.Length == 0 && dec.Eth.EthernetType == layers.EthernetTypeLLC && bytes.Equal(zeroMAC, dec.Eth.SrcMAC) && bytes.Equal(zeroMAC, dec.Eth.DstMAC) } + +func (dec *EthernetDecoder) DF() bool { + return len(dec.decoded) == 2 && (dec.IP.Flags&layers.IPv4DontFragment != 0) +} diff --git a/router/router.go b/router/router.go index 339c20fb..11cc3038 100644 --- a/router/router.go +++ b/router/router.go @@ -2,7 +2,6 @@ package router import ( "bytes" - "code.google.com/p/gopacket/layers" "encoding/binary" "fmt" "io" @@ -155,12 +154,9 @@ func (router *Router) handleCapturedPacket(frameData []byte, dec *EthernetDecode if found && dstPeer == router.Ourself.Peer { return } - df := decodedLen == 2 && (dec.IP.Flags&layers.IPv4DontFragment != 0) - if df { - router.LogFrame("Forwarding DF", frameData, dec) - } else { - router.LogFrame("Forwarding", frameData, dec) - } + df := dec.DF() + router.LogFrame("Forwarding", frameData, dec) + // at this point we are handing over the frame to forwarders, so // we need to make a copy of it in order to prevent the next // capture from overwriting the data @@ -300,16 +296,11 @@ func (router *Router) handleUDPPacketFunc(relayConn *LocalConnection, dec *Ether return } - df := decodedLen == 2 && (dec.IP.Flags&layers.IPv4DontFragment != 0) + df := dec.DF() if dstPeer != router.Ourself.Peer { // it's not for us, we're just relaying it - if df { - router.LogFrame("Relaying DF", frame, dec) - } else { - router.LogFrame("Relaying", frame, dec) - } - + router.LogFrame("Relaying", frame, dec) err := router.Ourself.Relay(srcPeer, dstPeer, df, frame, dec) if ftbe, ok := err.(FrameTooBigError); ok { err = dec.sendICMPFragNeeded(ftbe.EPMTU, func(icmpFrame []byte) error { diff --git a/weaver/main.go b/weaver/main.go index 9b2f9f39..7f1bb896 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -172,11 +172,17 @@ func logFrameFunc(debug bool) weave.LogFrameFunc { } return func(prefix string, frame []byte, dec *weave.EthernetDecoder) { h := fmt.Sprintf("%x", sha256.Sum256(frame)) - if dec == nil { - log.Println(prefix, len(frame), "bytes (", h, ")") - } else { - log.Println(prefix, len(frame), "bytes (", h, "):", dec.Eth.SrcMAC, "->", dec.Eth.DstMAC) + parts := []interface{}{prefix, len(frame), "bytes (", h, ")"} + + if dec != nil { + parts = append(parts, dec.Eth.SrcMAC, "->", dec.Eth.DstMAC) + + if dec.DF() { + parts = append(parts, "(DF)") + } } + + log.Println(parts...) } }