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:
1 parent
aef5111af2
commit
7dd0bcd1e0
2 files changed
+20
-11
No files matched your search
+18
-11
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user