From f5e3450f0c54bdb2a564077cd41d2316574083a1 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Wed, 27 Aug 2014 17:27:14 +0100 Subject: [PATCH] refactor: clear distinction between actual and effective pmtu --- forwarder.go | 14 +++++++------- types.go | 6 +++++- utils.go | 4 ++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/forwarder.go b/forwarder.go index c316e1c6..00442dc1 100644 --- a/forwarder.go +++ b/forwarder.go @@ -70,8 +70,8 @@ func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, sto var pmtuVerifyTick <-chan time.Time var clientPMTU int maxPayload := pmtu - UDPOverhead - calculateClientPMTU := func(ftbe FrameTooBigError) { - maxPayload = ftbe.PMTU - UDPOverhead + calculateClientPMTU := func(mtbe MsgTooBigError) { + maxPayload = mtbe.PMTU - UDPOverhead clientPMTU = maxPayload - enc.PacketOverhead() - enc.FrameOverhead() - EthernetOverhead } updateClientPMTU := func() { @@ -86,8 +86,8 @@ func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, sto enc.AppendFrame(pmtuVerifyFrame) err := udpSender.Send(enc.Bytes()) if err != nil { - if ftbe, ok := err.(FrameTooBigError); ok { - calculateClientPMTU(ftbe) + if mtbe, ok := err.(MsgTooBigError); ok { + calculateClientPMTU(mtbe) gotNewPMTU = true break } @@ -107,8 +107,8 @@ func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, sto flush := func() { err := udpSender.Send(enc.Bytes()) if err != nil { - if ftbe, ok := err.(FrameTooBigError); ok { - calculateClientPMTU(ftbe) + if mtbe, ok := err.(MsgTooBigError); ok { + calculateClientPMTU(mtbe) updateClientPMTU() } else if PosixError(err) == syscall.ENOBUFS { // TODO handle this better @@ -341,7 +341,7 @@ func (sender *RawUDPSender) Send(msg []byte) error { if err != nil { return err } - return FrameTooBigError{PMTU: pmtu} + return MsgTooBigError{PMTU: pmtu} } func (sender *RawUDPSender) Shutdown() error { diff --git a/types.go b/types.go index 971886af..a2210d39 100644 --- a/types.go +++ b/types.go @@ -98,8 +98,12 @@ type EthernetDecoder struct { parser *gopacket.DecodingLayerParser } +type MsgTooBigError struct { + PMTU int // actual pmtu, i.e. what the kernel told us +} + type FrameTooBigError struct { - PMTU int + PMTU int // effective pmtu, i.e. what we tell packet senders } type UnknownPeersError struct { diff --git a/utils.go b/utils.go index 23b9193c..4c262d61 100644 --- a/utils.go +++ b/utils.go @@ -30,6 +30,10 @@ func PosixError(err error) error { return operr.Err } +func (mtbe MsgTooBigError) Error() string { + return fmt.Sprint("Msg too big error. PMTU is ", mtbe.PMTU) +} + func (ftbe FrameTooBigError) Error() string { return fmt.Sprint("Frame too big error. PMTU is ", ftbe.PMTU) }