mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-26 22:21:35 +00:00
commit
b8592669b8
@ -225,11 +225,11 @@ func (tun *TunAdapter) reader() error {
|
|||||||
panic("Given empty dstNodeID and dstNodeIDMask - this shouldn't happen")
|
panic("Given empty dstNodeID and dstNodeIDMask - this shouldn't happen")
|
||||||
}
|
}
|
||||||
// Dial to the remote node
|
// Dial to the remote node
|
||||||
|
packet := append(util.GetBytes(), bs[:n]...)
|
||||||
go func() {
|
go func() {
|
||||||
// FIXME just spitting out a goroutine to do this is kind of ugly and means we drop packets until the dial finishes
|
// FIXME just spitting out a goroutine to do this is kind of ugly and means we drop packets until the dial finishes
|
||||||
tun.mutex.Lock()
|
tun.mutex.Lock()
|
||||||
_, known := tun.dials[*dstNodeID]
|
_, known := tun.dials[*dstNodeID]
|
||||||
packet := append(util.GetBytes(), bs[:n]...)
|
|
||||||
tun.dials[*dstNodeID] = append(tun.dials[*dstNodeID], packet)
|
tun.dials[*dstNodeID] = append(tun.dials[*dstNodeID], packet)
|
||||||
for len(tun.dials[*dstNodeID]) > 32 {
|
for len(tun.dials[*dstNodeID]) > 32 {
|
||||||
util.PutBytes(tun.dials[*dstNodeID][0])
|
util.PutBytes(tun.dials[*dstNodeID][0])
|
||||||
|
@ -211,7 +211,8 @@ func (c *Core) GetSessions() []Session {
|
|||||||
var sessions []Session
|
var sessions []Session
|
||||||
getSessions := func() {
|
getSessions := func() {
|
||||||
for _, sinfo := range c.sessions.sinfos {
|
for _, sinfo := range c.sessions.sinfos {
|
||||||
// TODO? skipped known but timed out sessions?
|
var session Session
|
||||||
|
workerFunc := func() {
|
||||||
session := Session{
|
session := Session{
|
||||||
Coords: append([]byte{}, sinfo.coords...),
|
Coords: append([]byte{}, sinfo.coords...),
|
||||||
MTU: sinfo.getMTU(),
|
MTU: sinfo.getMTU(),
|
||||||
@ -221,6 +222,20 @@ func (c *Core) GetSessions() []Session {
|
|||||||
WasMTUFixed: sinfo.wasMTUFixed,
|
WasMTUFixed: sinfo.wasMTUFixed,
|
||||||
}
|
}
|
||||||
copy(session.PublicKey[:], sinfo.theirPermPub[:])
|
copy(session.PublicKey[:], sinfo.theirPermPub[:])
|
||||||
|
}
|
||||||
|
var skip bool
|
||||||
|
func() {
|
||||||
|
defer func() {
|
||||||
|
if recover() != nil {
|
||||||
|
skip = true
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
sinfo.doWorker(workerFunc)
|
||||||
|
}()
|
||||||
|
if skip {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// TODO? skipped known but timed out sessions?
|
||||||
sessions = append(sessions, session)
|
sessions = append(sessions, session)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -236,6 +236,11 @@ func (c *Conn) Write(b []byte) (bytesWritten int, err error) {
|
|||||||
timer := getDeadlineTimer(&c.writeDeadline)
|
timer := getDeadlineTimer(&c.writeDeadline)
|
||||||
defer util.TimerStop(timer)
|
defer util.TimerStop(timer)
|
||||||
// Hand over to the session worker
|
// Hand over to the session worker
|
||||||
|
defer func() {
|
||||||
|
if recover() != nil {
|
||||||
|
err = errors.New("write failed")
|
||||||
|
}
|
||||||
|
}() // In case we're racing with a close
|
||||||
select { // Send to worker
|
select { // Send to worker
|
||||||
case sinfo.worker <- workerFunc:
|
case sinfo.worker <- workerFunc:
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
|
Loading…
Reference in New Issue
Block a user