TLSConfig *tls.Config
LnUDP *net.UDPConn
Peers = make(map[string]chan udpobfs.Buf)
+ PeersM sync.RWMutex
Bufs = sync.Pool{New: func() any { return new([udpobfs.BufLen]byte) }}
)
}
cryptoState := udpobfs.NewCryptoState(seed, true)
txs := make(chan udpobfs.Buf)
- rxFinished := make(chan struct{})
+ PeersM.Lock()
+ Peers[localAddr.String()] = txs
+ PeersM.Unlock()
var rxPkts, txPkts, rxBytes, txBytes int64
+ {
+ txPkts++
+ txBytes += int64(len(dataInitial))
+ tmp := make([]byte, udpobfs.SeqLen+len(dataInitial))
+ connUDP.WriteTo(cryptoState.Tx(tmp, dataInitial), DstAddrUDP)
+ }
+ rxFinished := make(chan struct{})
go func() {
var n int
var err error
lastPing := now
last := now
var got []byte
+ var ok bool
for {
select {
case <-ticker.C:
cryptoState.Tx(buf[:udpobfs.SeqLen], nil), DstAddrUDP)
lastPing = now
}
- case tx = <-txs:
- if tx.Buf == nil {
+ case tx, ok = <-txs:
+ if !ok {
return
}
got = cryptoState.Tx(buf[:udpobfs.SeqLen+tx.N], (*tx.Buf)[:tx.N])
}
}
}()
- Peers[localAddr.String()] = txs
- {
- txPkts++
- txBytes += int64(len(dataInitial))
- tmp := make([]byte, udpobfs.SeqLen+len(dataInitial))
- connUDP.WriteTo(cryptoState.Tx(tmp, dataInitial), DstAddrUDP)
- }
go func() {
defer connUDP.Close()
ticker := time.NewTicker(udpobfs.LifetimeDuration)
"rxBytes", rxBytes,
"txPkts", txPkts,
"txBytes", txBytes)
+ PeersM.Lock()
delete(Peers, localAddr.String())
- txs <- udpobfs.Buf{Buf: nil}
- go func() {
- for range txs {
- }
- }()
+ PeersM.Unlock()
+ close(txs)
}
func main() {
if n == 0 {
continue
}
+ PeersM.RLock()
txs = Peers[from.String()]
if txs != nil {
txs <- udpobfs.Buf{Buf: buf, N: n}
}
+ PeersM.RUnlock()
if txs == nil {
neu := make([]byte, n)
copy(neu, (*buf)[:n])
LnUDP *net.UDPConn
LnTCP *net.TCPListener
Peers = make(map[string]chan udpobfs.Buf)
+ PeersM sync.RWMutex
Bufs = sync.Pool{New: func() any { return new([udpobfs.BufLen]byte) }}
)
}
cryptoState := udpobfs.NewCryptoState(seed, false)
txs := make(chan udpobfs.Buf)
+ PeersM.Lock()
+ Peers[remoteAddr.String()] = txs
+ PeersM.Unlock()
txFinished := make(chan struct{})
var rxPkts, txPkts, rxBytes, txBytes int64
go func() {
buf := make([]byte, udpobfs.BufLen)
var tx udpobfs.Buf
var got []byte
+ var ok bool
for {
select {
case <-txFinished:
localUDP.Close()
return
}
- case tx = <-txs:
- if tx.Buf == nil {
- break
+ case tx, ok = <-txs:
+ if !ok {
+ return
}
if tx.N < udpobfs.SeqLen {
logger.Warn("too short")
}
}
}()
- Peers[remoteAddr.String()] = txs
go func() {
buf := make([]byte, 8)
for {
"rxBytes", rxBytes,
"txPkts", txPkts,
"txBytes", txBytes)
+ PeersM.Lock()
delete(Peers, remoteAddr.String())
- txs <- udpobfs.Buf{Buf: nil}
- go func() {
- for range txs {
- }
- }()
+ PeersM.Unlock()
+ close(txs)
}
func main() {
if n == 0 {
continue
}
+ PeersM.RLock()
txs = Peers[from.String()]
if txs != nil {
txs <- udpobfs.Buf{Buf: buf, N: n}
}
+ PeersM.RUnlock()
}
}()