From 4710a59ac8907069fcab968ad13bc0394ab459ec Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Wed, 27 Aug 2014 21:40:16 +0100 Subject: [PATCH] calculate an initial effectivePMTU That way as soon as the forwarder is live we have a sensible value --- forwarder.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/forwarder.go b/forwarder.go index 36c40071..abcbee67 100644 --- a/forwarder.go +++ b/forwarder.go @@ -29,8 +29,10 @@ func (conn *LocalConnection) ensureForwarders() error { encryptorDF = NewNonEncryptor(conn.local.NameByte) } - // The forward chans in the conn struct are read by other - // processes, so we have to use locks. + maxPayload, effectivePMTU := maxPayloadAndEffectivePMTU(encryptorDF, DefaultPMTU) + + // The forward chans and effectivePMTU in the conn struct are read + // by other processes, so we have to use locks. var ( forwardChan = make(chan *ForwardedFrame, ChannelSize) forwardChanDF = make(chan *ForwardedFrame, ChannelSize) @@ -42,9 +44,10 @@ func (conn *LocalConnection) ensureForwarders() error { conn.forwardChanDF = forwardChanDF conn.stopForward = stopForward conn.stopForwardDF = stopForwardDF + conn.effectivePMTU = effectivePMTU conn.Unlock() - go conn.forwarderLoop(forwardChan, stopForward, encryptor, udpSender, DefaultPMTU) - go conn.forwarderLoop(forwardChanDF, stopForwardDF, encryptorDF, udpSenderDF, conn.effectivePMTU) + go conn.forwarderLoop(forwardChan, stopForward, encryptor, udpSender, maxPayload, effectivePMTU) + go conn.forwarderLoop(forwardChanDF, stopForwardDF, encryptorDF, udpSenderDF, maxPayload, effectivePMTU) return nil } @@ -63,17 +66,9 @@ func (conn *LocalConnection) stopForwarders() { } } -func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, stop <-chan interface{}, enc Encryptor, udpSender UDPSender, pmtu int) { +func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, stop <-chan interface{}, enc Encryptor, udpSender UDPSender, maxPayload int, effectivePMTU int) { defer udpSender.Shutdown() - // The pmtu governs the max size of msg we can pass to the - // udpSender. udpSender will add in the UDP/IP headers var pmtuVerifyTick <-chan time.Time - var effectivePMTU int - maxPayload := pmtu - UDPOverhead - calculateEffectivePMTU := func(mtbe MsgTooBigError) { - maxPayload = mtbe.PMTU - UDPOverhead - effectivePMTU = maxPayload - enc.PacketOverhead() - enc.FrameOverhead() - EthernetOverhead - } updateEffectivePMTU := func() { for gotNewPMTU := true; gotNewPMTU; { conn.setEffectivePMTU(effectivePMTU) @@ -87,7 +82,7 @@ func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, sto err := udpSender.Send(enc.Bytes()) if err != nil { if mtbe, ok := err.(MsgTooBigError); ok { - calculateEffectivePMTU(mtbe) + maxPayload, effectivePMTU = maxPayloadAndEffectivePMTU(enc, mtbe.PMTU) gotNewPMTU = true break } @@ -108,7 +103,7 @@ func (conn *LocalConnection) forwarderLoop(forwardCh <-chan *ForwardedFrame, sto err := udpSender.Send(enc.Bytes()) if err != nil { if mtbe, ok := err.(MsgTooBigError); ok { - calculateEffectivePMTU(mtbe) + maxPayload, effectivePMTU = maxPayloadAndEffectivePMTU(enc, mtbe.PMTU) updateEffectivePMTU() } else if PosixError(err) == syscall.ENOBUFS { // TODO handle this better @@ -223,6 +218,12 @@ func (conn *LocalConnection) Forward(df bool, frame *ForwardedFrame, dec *Ethern } } +func maxPayloadAndEffectivePMTU(enc Encryptor, pmtu int) (maxPayload int, effectivePMTU int) { + maxPayload = pmtu - UDPOverhead + effectivePMTU = maxPayload - enc.PacketOverhead() - enc.FrameOverhead() - EthernetOverhead + return +} + func fragment(eth layers.Ethernet, ip layers.IPv4, pmtu int, frame *ForwardedFrame, forward func(*ForwardedFrame)) error { // We are not doing any sort of NAT, so we don't need to worry // about checksums of IP payload (eg UDP checksum).