diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 91985ced..7b98dbb6 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -11,7 +11,6 @@ import ( "runtime" "strings" - "code.google.com/p/gopacket/layers" "github.com/davecheney/profile" "github.com/gorilla/mux" . "github.com/weaveworks/weave/common" @@ -196,11 +195,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...) } } diff --git a/router/ethernet_decoder.go b/router/ethernet_decoder.go index 0080cc82..036840c8 100644 --- a/router/ethernet_decoder.go +++ b/router/ethernet_decoder.go @@ -75,3 +75,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 8873729c..67d7b239 100644 --- a/router/router.go +++ b/router/router.go @@ -11,7 +11,6 @@ import ( "syscall" "time" - "code.google.com/p/gopacket/layers" . "github.com/weaveworks/weave/common" ) @@ -170,12 +169,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 @@ -316,16 +312,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 {