deal with pmtu verification confirmation in forwarder goroutine

...rather than connection goroutine.
This is a precurser to smarter pmtu verification, the logic for which
is in the forwarder.
issue #15
This commit is contained in:
Matthias Radestock committed 2014-08-30 23:18:44 +01:00
1 parent aef5111af2
commit 7dd0bcd1e0
2 files changed
+20 -11

No files matched your search

+18 -11
View File
@@ -34,17 +34,21 @@ func (conn *LocalConnection) ensureForwarders() error {
forwardChanDF = make(chan *ForwardedFrame, ChannelSize)
stopForward = make(chan interface{}, 0)
stopForwardDF = make(chan interface{}, 0)
verifyPMTU = make(chan int, ChannelSize)
)
forwarder := NewForwarder(conn, forwardChan, stopForward, encryptor, udpSender, DefaultPMTU)
forwarderDF := NewForwarder(conn, forwardChanDF, stopForwardDF, encryptorDF, udpSenderDF, DefaultPMTU)
//NB: only forwarderDF can ever encounter EMSGSIZE errors, and
//thus perform PMTU verification
forwarder := NewForwarder(conn, forwardChan, stopForward, nil, encryptor, udpSender, DefaultPMTU)
forwarderDF := NewForwarder(conn, forwardChanDF, stopForwardDF, verifyPMTU, encryptorDF, udpSenderDF, DefaultPMTU)
// The forward chans and effectivePMTU in the conn struct are read
// by other processes, so we have to use locks.
// Various fields in the conn struct are read by other processes,
// so we have to use locks.
conn.Lock()
conn.forwardChan = forwardChan
conn.forwardChanDF = forwardChanDF
conn.stopForward = stopForward
conn.stopForwardDF = stopForwardDF
conn.verifyPMTU = verifyPMTU
conn.effectivePMTU = forwarder.effectivePMTU
conn.Unlock()
@@ -179,13 +183,14 @@ func fragment(eth layers.Ethernet, ip layers.IPv4, pmtu int, frame *ForwardedFra
// Forwarder
func NewForwarder(conn *LocalConnection, ch <-chan *ForwardedFrame, stop <-chan interface{}, enc Encryptor, udpSender UDPSender, pmtu int) *Forwarder {
forwarder := &Forwarder{
conn: conn,
ch: ch,
stop: stop,
enc: enc,
udpSender: udpSender}
func NewForwarder(conn *LocalConnection, ch <-chan *ForwardedFrame, stop <-chan interface{}, pmtuVerified <-chan int, enc Encryptor, udpSender UDPSender, pmtu int) *Forwarder {
forwarder := &Forwarder{
conn: conn,
ch: ch,
stop: stop,
pmtuVerified: pmtuVerified,
enc: enc,
udpSender: udpSender}
forwarder.setMaxPayloadAndEffectivePMTU(pmtu)
return forwarder
}
@@ -216,6 +221,8 @@ func (fwd *Forwarder) Run() {
}
fwd.verifyEffectivePMTU()
}
case pmtu := <-fwd.pmtuVerified:
fwd.conn.effectivePMTUVerification(pmtu)
case frame = <-fwd.ch:
if !fwd.appendFrame(frame) {
fwd.logDrop(frame)
+2
View File
@@ -73,6 +73,7 @@ type LocalConnection struct {
forwardChanDF chan<- *ForwardedFrame
stopForward chan<- interface{}
stopForwardDF chan<- interface{}
verifyPMTU chan<- int
Decryptor Decryptor
Router *Router
UID uint64
@@ -90,6 +91,7 @@ type Forwarder struct {
ch <-chan *ForwardedFrame
stop <-chan interface{}
pmtuVerifyTick <-chan time.Time
pmtuVerified <-chan int
pmtuVerifyCount uint
enc Encryptor
udpSender UDPSender