diff --git a/interface.go b/interface.go index 2487010..cdf0d42 100644 --- a/interface.go +++ b/interface.go @@ -352,7 +352,7 @@ func (f *Interface) listenIn(reader overlay.TunDev, queueNum int) { now := time.Now() for i, pkt := range packets[:n] { - outPackets[i].OutLen = -1 + outPackets[i].ReadyToSend = false f.consumeInsidePacket(pkt.Payload, fwPacket, nb, outPackets[i], queueNum, conntrackCache.Get(f.l), now) reader.RecycleRxSeg(pkt, i == (n-1), queueNum) //todo handle err? pkt.Reset() diff --git a/outside.go b/outside.go index d01dbf9..8da7774 100644 --- a/outside.go +++ b/outside.go @@ -181,9 +181,7 @@ func (f *Interface) readOutsidePacketsMany(packets []*packet.Packet, out []*pack } } - //todo per-segment! for segment := range pkt.Segments() { - err := h.Parse(segment) if err != nil { // Hole punch packets are 0 or 1 byte big, so lets ignore printing those errors @@ -208,7 +206,6 @@ func (f *Interface) readOutsidePacketsMany(packets []*packet.Packet, out []*pack switch h.Type { case header.Message: - // TODO handleEncrypted sends directly to addr on error. Handle this in the tunneling case. if !f.handleEncrypted(ci, via, h) { return } @@ -676,7 +673,6 @@ func (f *Interface) decryptToTunDelayWrite(hostinfo *HostInfo, messageCounter ui } f.connectionManager.In(hostinfo) - pkt.OutLen += len(inSegment) out.Segments[seg] = out.Segments[seg][:len(out.SegmentHeaders[seg])+len(out.SegmentPayloads[seg])] return true } diff --git a/overlay/vhostnet/device.go b/overlay/vhostnet/device.go index 435424b..c154336 100644 --- a/overlay/vhostnet/device.go +++ b/overlay/vhostnet/device.go @@ -271,9 +271,6 @@ func (dev *Device) TransmitPackets(pkts []*packet.OutPacket) error { return nil } -// TODO: Make above methods cancelable by taking a context.Context argument? -// TODO: Implement zero-copy variants to transmit and receive packets? - // processChains processes as many chains as needed to create one packet. The number of processed chains is returned. func (dev *Device) processChains(pkt *packet.VirtIOPacket, chains []virtqueue.UsedElement) (int, error) { //read first element to see how many descriptors we need: diff --git a/packet/packet.go b/packet/packet.go index 31b9fd9..29bd071 100644 --- a/packet/packet.go +++ b/packet/packet.go @@ -19,9 +19,7 @@ type Packet struct { Name []byte SegSize int - //todo should this hold out as well? - OutLen int - + ReadyToSend bool wasSegmented bool isV4 bool } @@ -71,7 +69,6 @@ func (p *Packet) updateCtrl(ctrlLen int) { // Update sets a Packet into "just received, not processed" state func (p *Packet) Update(ctrlLen int) { - p.OutLen = -1 p.updateCtrl(ctrlLen) } diff --git a/udp/udp_linux.go b/udp/udp_linux.go index e39af7b..fd8f6c6 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -220,8 +220,8 @@ func (u *StdConn) Prep(pkt *packet.Packet, addr netip.AddrPort) error { if err != nil { return err } + pkt.ReadyToSend = true pkt.Name = pkt.Name[:nl] - pkt.OutLen = len(pkt.Payload) return nil } @@ -239,7 +239,7 @@ func (u *StdConn) WriteBatch(pkts []*packet.Packet) (int, error) { //segmenting := false idx := 0 for _, pkt := range pkts { - if len(pkt.Payload) == 0 || pkt.OutLen == -1 { + if !pkt.ReadyToSend || len(pkt.Payload) == 0 { sent++ continue }