diff --git a/router/forwarder.go b/router/forwarder.go index 94025bce..fee2d2d0 100644 --- a/router/forwarder.go +++ b/router/forwarder.go @@ -236,10 +236,7 @@ func (fwd *Forwarder) Start() { func (fwd *Forwarder) run() { defer fwd.udpSender.Shutdown() - var flushed, ok bool - var frame *ForwardedFrame for { - flushed = false select { case <-fwd.stop: fwd.drain() @@ -274,29 +271,12 @@ func (fwd *Forwarder) run() { fwd.conn.setEffectivePMTU(epmtu) fwd.conn.Log("Effective PMTU verified at", epmtu) } - case frame = <-fwd.ch: + case frame := <-fwd.ch: if !fwd.appendFrame(frame) { fwd.logDrop(frame) continue } - for !flushed { - select { - case frame, ok = <-fwd.ch: - if !ok { - return - } - if !fwd.appendFrame(frame) { - fwd.flush() - if !fwd.appendFrame(frame) { - fwd.logDrop(frame) - flushed = true - } - } - default: - fwd.flush() - flushed = true - } - } + fwd.accumulateAndSendFrames() } } } @@ -323,6 +303,24 @@ func (fwd *Forwarder) attemptVerifyEffectivePMTU() { } } +func (fwd *Forwarder) accumulateAndSendFrames() { + for { + select { + case frame := <-fwd.ch: + if !fwd.appendFrame(frame) { + fwd.flush() + if !fwd.appendFrame(frame) { + fwd.logDrop(frame) + return + } + } + default: + fwd.flush() + return + } + } +} + func (fwd *Forwarder) appendFrame(frame *ForwardedFrame) bool { frameLen := len(frame.frame) if fwd.enc.TotalLen()+fwd.enc.FrameOverhead()+frameLen > fwd.maxPayload {