diff --git a/bits.go b/bits.go index b4f96c6..9fb4f11 100644 --- a/bits.go +++ b/bits.go @@ -43,7 +43,7 @@ func (b *Bits) Check(l logrus.FieldLogger, i uint64) bool { } // Not within the window - l.Debugf("rejected a packet (top) %d %d\n", b.current, i) + l.Debugf("rejected a packet (top) %d %d delta %d\n", b.current, i, b.current-i) return false } diff --git a/interface.go b/interface.go index a814b4b..e6da5b8 100644 --- a/interface.go +++ b/interface.go @@ -288,7 +288,7 @@ func (f *Interface) listenOut(q int) { } f.readOutsidePacketsMany(pkts, outPackets, h, fwPacket, lhh, nb, q, ctCache.Get(f.l)) - for i := range outPackets { + for i := range pkts { if pkts[i].OutLen != -1 { for j := 0; j < outPackets[i].SegCounter; j++ { if len(outPackets[i].Segments[j]) > 0 { @@ -298,12 +298,15 @@ func (f *Interface) listenOut(q int) { } } //toSend = toSend[:toSendCount] - if len(toSend) != 0 { - _, err := f.readers[q].WriteMany(toSend) + for i := 0; i < len(toSend); i += batch { + x := min(len(toSend[i:]), batch) + toSendThisTime := toSend[i : i+x] + _, err := f.readers[q].WriteMany(toSendThisTime) if err != nil { f.l.WithError(err).Error("Failed to write messages") } } + }) } diff --git a/overlay/tun_linux.go b/overlay/tun_linux.go index 9c65162..ad6c4f8 100644 --- a/overlay/tun_linux.go +++ b/overlay/tun_linux.go @@ -745,7 +745,9 @@ func (t *tun) Write(b []byte) (int, error) { func (t *tun) WriteMany(b [][]byte) (int, error) { maximum := len(b) //we are RXing - + if maximum == 0 { + return 0, nil + } hdr := virtio.NetHdr{ //todo Flags: unix.VIRTIO_NET_HDR_F_DATA_VALID, GSOType: unix.VIRTIO_NET_HDR_GSO_NONE, diff --git a/udp/udp_linux.go b/udp/udp_linux.go index ec5eeb3..8861e4d 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -129,7 +129,7 @@ func (u *StdConn) ListenOut(r EncReader) { packets[i].Payload = packets[i].Payload[:msgs[i].Len] packets[i].Update(getRawMessageControlLen(&msgs[i])) } - r(packets) + r(packets[:n]) for i := 0; i < n; i++ { //todo reset this in prev loop, but this makes debug ez msgs[i].Hdr.Controllen = uint64(unix.CmsgSpace(2)) }