Skip to content

Commit 393c7de

Browse files
committed
Move DeliverNetworkPacket into separate goroutine
... as it may write in the same ironwood context as the reader if packet destination is unknown or some other condition requires replyWithReset Thanks to @Arceliar for hint! Signed-off-by: Vasyl Gello <[email protected]>
1 parent b232781 commit 393c7de

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/netstack/yggdrasil.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@ import (
1515
)
1616

1717
type YggdrasilNIC struct {
18-
stack *YggdrasilNetstack
19-
ipv6rwc *ipv6rwc.ReadWriteCloser
20-
dispatcher stack.NetworkDispatcher
21-
readBuf []byte
22-
writeBuf []byte
18+
stack *YggdrasilNetstack
19+
ipv6rwc *ipv6rwc.ReadWriteCloser
20+
dispatcher stack.NetworkDispatcher
21+
readBufChan chan *stack.PacketBuffer
22+
writeBuf []byte
2323
}
2424

2525
func (s *YggdrasilNetstack) NewYggdrasilNIC(ygg *core.Core) tcpip.Error {
2626
rwc := ipv6rwc.NewReadWriteCloser(ygg)
2727
mtu := rwc.MTU()
2828
nic := &YggdrasilNIC{
2929
ipv6rwc: rwc,
30-
readBuf: make([]byte, mtu),
30+
readBufChan: make(chan *stack.PacketBuffer, 100),
3131
writeBuf: make([]byte, mtu),
3232
}
3333
if err := s.stack.CreateNIC(1, nic); err != nil {
@@ -36,16 +36,22 @@ func (s *YggdrasilNetstack) NewYggdrasilNIC(ygg *core.Core) tcpip.Error {
3636
go func() {
3737
var rx int
3838
var err error
39+
readBuf := make([]byte, mtu)
3940
for {
40-
rx, err = nic.ipv6rwc.Read(nic.readBuf)
41+
rx, err = nic.ipv6rwc.Read(readBuf)
4142
if err != nil {
4243
log.Println(err)
4344
break
4445
}
4546
pkb := stack.NewPacketBuffer(stack.PacketBufferOptions{
46-
Payload: buffer.MakeWithData(nic.readBuf[:rx]),
47+
Payload: buffer.MakeWithData(readBuf[:rx]),
4748
})
48-
go nic.dispatcher.DeliverNetworkPacket(ipv6.ProtocolNumber, pkb)
49+
nic.readBufChan <- pkb
50+
}
51+
}()
52+
go func() {
53+
for {
54+
nic.dispatcher.DeliverNetworkPacket(ipv6.ProtocolNumber, <- nic.readBufChan)
4955
}
5056
}()
5157
_, snet, err := net.ParseCIDR("0200::/7")

0 commit comments

Comments
 (0)