diff --git a/pkg/sentry/socket/netfilter/owner_matcher.go b/pkg/sentry/socket/netfilter/owner_matcher.go index 92bc4811b..2a328e969 100644 --- a/pkg/sentry/socket/netfilter/owner_matcher.go +++ b/pkg/sentry/socket/netfilter/owner_matcher.go @@ -120,7 +120,7 @@ func (*OwnerMatcher) revision() uint8 { } // Match implements Matcher.Match. -func (om *OwnerMatcher) Match(hook stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (bool, bool) { +func (om *OwnerMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, _, _ string) (bool, bool) { // Support only for OUTPUT chain. if hook != stack.Output { return false, true diff --git a/pkg/sentry/socket/netfilter/owner_matcher_v1.go b/pkg/sentry/socket/netfilter/owner_matcher_v1.go index 8c740745e..09d14d0a7 100644 --- a/pkg/sentry/socket/netfilter/owner_matcher_v1.go +++ b/pkg/sentry/socket/netfilter/owner_matcher_v1.go @@ -115,7 +115,7 @@ func (*OwnerMatcherV1) revision() uint8 { } // Match implements Matcher.Match. -func (om *OwnerMatcherV1) Match(hook stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (bool, bool) { +func (om *OwnerMatcherV1) Match(hook stack.Hook, pkt *stack.PacketBuffer, _, _ string) (bool, bool) { // Support only for OUTPUT chain. if hook != stack.Output { return false, true diff --git a/pkg/sentry/socket/netfilter/targets.go b/pkg/sentry/socket/netfilter/targets.go index 7a9cc29d5..f8a892ba3 100644 --- a/pkg/sentry/socket/netfilter/targets.go +++ b/pkg/sentry/socket/netfilter/targets.go @@ -498,7 +498,7 @@ func (jt *JumpTarget) id() targetID { } // Action implements stack.Target.Action. -func (jt *JumpTarget) Action(stack.PacketBufferPtr, stack.Hook, *stack.Route, stack.AddressableEndpoint) (stack.RuleVerdict, int) { +func (jt *JumpTarget) Action(*stack.PacketBuffer, stack.Hook, *stack.Route, stack.AddressableEndpoint) (stack.RuleVerdict, int) { return stack.RuleJump, jt.RuleNum } diff --git a/pkg/sentry/socket/netfilter/tcp_matcher.go b/pkg/sentry/socket/netfilter/tcp_matcher.go index 7ae0f51f7..cac646bf0 100644 --- a/pkg/sentry/socket/netfilter/tcp_matcher.go +++ b/pkg/sentry/socket/netfilter/tcp_matcher.go @@ -109,7 +109,7 @@ func (*TCPMatcher) revision() uint8 { } // Match implements Matcher.Match. -func (tm *TCPMatcher) Match(hook stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (bool, bool) { +func (tm *TCPMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, _, _ string) (bool, bool) { switch pkt.NetworkProtocolNumber { case header.IPv4ProtocolNumber: netHeader := header.IPv4(pkt.NetworkHeader().Slice()) diff --git a/pkg/sentry/socket/netfilter/udp_matcher.go b/pkg/sentry/socket/netfilter/udp_matcher.go index 73aa15eef..3bad4bea0 100644 --- a/pkg/sentry/socket/netfilter/udp_matcher.go +++ b/pkg/sentry/socket/netfilter/udp_matcher.go @@ -99,7 +99,7 @@ func (*UDPMatcher) revision() uint8 { } // Match implements Matcher.Match. -func (um *UDPMatcher) Match(hook stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (bool, bool) { +func (um *UDPMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, _, _ string) (bool, bool) { switch pkt.NetworkProtocolNumber { case header.IPv4ProtocolNumber: netHeader := header.IPv4(pkt.NetworkHeader().Slice()) diff --git a/pkg/tcpip/header/parse/parse.go b/pkg/tcpip/header/parse/parse.go index 33a85fdbc..adcfd77c7 100644 --- a/pkg/tcpip/header/parse/parse.go +++ b/pkg/tcpip/header/parse/parse.go @@ -27,7 +27,7 @@ import ( // pkt.Data. // // Returns true if the header was successfully parsed. -func ARP(pkt stack.PacketBufferPtr) bool { +func ARP(pkt *stack.PacketBuffer) bool { _, ok := pkt.NetworkHeader().Consume(header.ARPSize) if ok { pkt.NetworkProtocolNumber = header.ARPProtocolNumber @@ -39,7 +39,7 @@ func ARP(pkt stack.PacketBufferPtr) bool { // header with the IPv4 header. // // Returns true if the header was successfully parsed. -func IPv4(pkt stack.PacketBufferPtr) bool { +func IPv4(pkt *stack.PacketBuffer) bool { hdr, ok := pkt.Data().PullUp(header.IPv4MinimumSize) if !ok { return false @@ -71,7 +71,7 @@ func IPv4(pkt stack.PacketBufferPtr) bool { // IPv6 parses an IPv6 packet found in pkt.Data and populates pkt's network // header with the IPv6 header. -func IPv6(pkt stack.PacketBufferPtr) (proto tcpip.TransportProtocolNumber, fragID uint32, fragOffset uint16, fragMore bool, ok bool) { +func IPv6(pkt *stack.PacketBuffer) (proto tcpip.TransportProtocolNumber, fragID uint32, fragOffset uint16, fragMore bool, ok bool) { hdr, ok := pkt.Data().PullUp(header.IPv6MinimumSize) if !ok { return 0, 0, 0, false, false @@ -157,7 +157,7 @@ traverseExtensions: // header with the UDP header. // // Returns true if the header was successfully parsed. -func UDP(pkt stack.PacketBufferPtr) bool { +func UDP(pkt *stack.PacketBuffer) bool { _, ok := pkt.TransportHeader().Consume(header.UDPMinimumSize) pkt.TransportProtocolNumber = header.UDPProtocolNumber return ok @@ -167,7 +167,7 @@ func UDP(pkt stack.PacketBufferPtr) bool { // header with the TCP header. // // Returns true if the header was successfully parsed. -func TCP(pkt stack.PacketBufferPtr) bool { +func TCP(pkt *stack.PacketBuffer) bool { // TCP header is variable length, peek at it first. hdrLen := header.TCPMinimumSize hdr, ok := pkt.Data().PullUp(hdrLen) @@ -191,7 +191,7 @@ func TCP(pkt stack.PacketBufferPtr) bool { // if present. // // Returns true if an ICMPv4 header was successfully parsed. -func ICMPv4(pkt stack.PacketBufferPtr) bool { +func ICMPv4(pkt *stack.PacketBuffer) bool { if _, ok := pkt.TransportHeader().Consume(header.ICMPv4MinimumSize); ok { pkt.TransportProtocolNumber = header.ICMPv4ProtocolNumber return true @@ -203,7 +203,7 @@ func ICMPv4(pkt stack.PacketBufferPtr) bool { // if present. // // Returns true if an ICMPv6 header was successfully parsed. -func ICMPv6(pkt stack.PacketBufferPtr) bool { +func ICMPv6(pkt *stack.PacketBuffer) bool { hdr, ok := pkt.Data().PullUp(header.ICMPv6MinimumSize) if !ok { return false diff --git a/pkg/tcpip/link/channel/channel.go b/pkg/tcpip/link/channel/channel.go index dd23b1628..4c21fec47 100644 --- a/pkg/tcpip/link/channel/channel.go +++ b/pkg/tcpip/link/channel/channel.go @@ -43,7 +43,7 @@ type NotificationHandle struct { type queue struct { // c is the outbound packet channel. - c chan stack.PacketBufferPtr + c chan *stack.PacketBuffer mu sync.RWMutex // +checklocks:mu notify []*NotificationHandle @@ -58,7 +58,7 @@ func (q *queue) Close() { q.closed = true } -func (q *queue) Read() stack.PacketBufferPtr { +func (q *queue) Read() *stack.PacketBuffer { select { case p := <-q.c: return p @@ -67,7 +67,7 @@ func (q *queue) Read() stack.PacketBufferPtr { } } -func (q *queue) ReadContext(ctx context.Context) stack.PacketBufferPtr { +func (q *queue) ReadContext(ctx context.Context) *stack.PacketBuffer { select { case pkt := <-q.c: return pkt @@ -76,7 +76,7 @@ func (q *queue) ReadContext(ctx context.Context) stack.PacketBufferPtr { } } -func (q *queue) Write(pkt stack.PacketBufferPtr) tcpip.Error { +func (q *queue) Write(pkt *stack.PacketBuffer) tcpip.Error { // q holds the PacketBuffer. q.mu.RLock() if q.closed { @@ -152,7 +152,7 @@ type Endpoint struct { func New(size int, mtu uint32, linkAddr tcpip.LinkAddress) *Endpoint { return &Endpoint{ q: &queue{ - c: make(chan stack.PacketBufferPtr, size), + c: make(chan *stack.PacketBuffer, size), }, mtu: mtu, linkAddr: linkAddr, @@ -167,13 +167,13 @@ func (e *Endpoint) Close() { } // Read does non-blocking read one packet from the outbound packet queue. -func (e *Endpoint) Read() stack.PacketBufferPtr { +func (e *Endpoint) Read() *stack.PacketBuffer { return e.q.Read() } // ReadContext does blocking read for one packet from the outbound packet queue. // It can be cancelled by ctx, and in this case, it returns nil. -func (e *Endpoint) ReadContext(ctx context.Context) stack.PacketBufferPtr { +func (e *Endpoint) ReadContext(ctx context.Context) *stack.PacketBuffer { return e.q.ReadContext(ctx) } @@ -194,7 +194,7 @@ func (e *Endpoint) NumQueued() int { // InjectInbound injects an inbound packet. If the endpoint is not attached, the // packet is not delivered. -func (e *Endpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.mu.RLock() d := e.dispatcher e.mu.RUnlock() @@ -287,7 +287,7 @@ func (*Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (*Endpoint) AddHeader(stack.PacketBufferPtr) {} +func (*Endpoint) AddHeader(*stack.PacketBuffer) {} // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (*Endpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*Endpoint) ParseHeader(*stack.PacketBuffer) bool { return true } diff --git a/pkg/tcpip/link/ethernet/ethernet.go b/pkg/tcpip/link/ethernet/ethernet.go index e6f1e4d11..fd9fbfaca 100644 --- a/pkg/tcpip/link/ethernet/ethernet.go +++ b/pkg/tcpip/link/ethernet/ethernet.go @@ -59,7 +59,7 @@ func (e *Endpoint) MTU() uint32 { } // DeliverNetworkPacket implements stack.NetworkDispatcher. -func (e *Endpoint) DeliverNetworkPacket(_ tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) DeliverNetworkPacket(_ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { if !e.ParseHeader(pkt) { return } @@ -103,7 +103,7 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint. -func (*Endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (*Endpoint) AddHeader(pkt *stack.PacketBuffer) { eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize)) fields := header.EthernetFields{ SrcAddr: pkt.EgressRoute.LocalLinkAddress, @@ -114,7 +114,7 @@ func (*Endpoint) AddHeader(pkt stack.PacketBufferPtr) { } // ParseHeader implements stack.LinkEndpoint. -func (*Endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (*Endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { _, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize) return ok } diff --git a/pkg/tcpip/link/ethernet/ethernet_test.go b/pkg/tcpip/link/ethernet/ethernet_test.go index 8e81236ae..014183fe3 100644 --- a/pkg/tcpip/link/ethernet/ethernet_test.go +++ b/pkg/tcpip/link/ethernet/ethernet_test.go @@ -33,18 +33,18 @@ var _ stack.NetworkDispatcher = (*testNetworkDispatcher)(nil) type deliveredPacket struct { protocol tcpip.NetworkProtocolNumber - packet stack.PacketBufferPtr + packet *stack.PacketBuffer } type testNetworkDispatcher struct { networkPackets []deliveredPacket } -func (t *testNetworkDispatcher) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pb stack.PacketBufferPtr) { +func (t *testNetworkDispatcher) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pb *stack.PacketBuffer) { t.networkPackets = append(t.networkPackets, deliveredPacket{protocol: proto, packet: pb}) } -func (*testNetworkDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (*testNetworkDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { panic("not implemented") } diff --git a/pkg/tcpip/link/fdbased/endpoint.go b/pkg/tcpip/link/fdbased/endpoint.go index dd5d2e162..faede2b5d 100644 --- a/pkg/tcpip/link/fdbased/endpoint.go +++ b/pkg/tcpip/link/fdbased/endpoint.go @@ -516,7 +516,7 @@ const ( ) // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *endpoint) AddHeader(pkt *stack.PacketBuffer) { if e.hdrSize > 0 { // Add ethernet header if needed. eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize)) @@ -528,14 +528,14 @@ func (e *endpoint) AddHeader(pkt stack.PacketBufferPtr) { } } -func (e *endpoint) parseHeader(pkt stack.PacketBufferPtr) bool { +func (e *endpoint) parseHeader(pkt *stack.PacketBuffer) bool { _, ok := pkt.LinkHeader().Consume(e.hdrSize) return ok } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (e *endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (e *endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { if e.hdrSize > 0 { return e.parseHeader(pkt) } @@ -544,7 +544,7 @@ func (e *endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { // writePacket writes outbound packets to the file descriptor. If it is not // currently writable, the packet is dropped. -func (e *endpoint) writePacket(pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) writePacket(pkt *stack.PacketBuffer) tcpip.Error { fdInfo := e.fds[pkt.Hash%uint32(len(e.fds))] fd := fdInfo.fd var vnetHdrBuf []byte @@ -594,7 +594,7 @@ func (e *endpoint) writePacket(pkt stack.PacketBufferPtr) tcpip.Error { return rawfile.NonBlockingWriteIovec(fd, iovecs) } -func (e *endpoint) sendBatch(batchFDInfo fdInfo, pkts []stack.PacketBufferPtr) (int, tcpip.Error) { +func (e *endpoint) sendBatch(batchFDInfo fdInfo, pkts []*stack.PacketBuffer) (int, tcpip.Error) { // Degrade to writePacket if underlying fd is not a socket. if !batchFDInfo.isSocket { var written int @@ -711,7 +711,7 @@ func (e *endpoint) sendBatch(batchFDInfo fdInfo, pkts []stack.PacketBufferPtr) ( // - pkt.NetworkProtocolNumber func (e *endpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.Error) { // Preallocate to avoid repeated reallocation as we append to batch. - batch := make([]stack.PacketBufferPtr, 0, BatchSize) + batch := make([]*stack.PacketBuffer, 0, BatchSize) batchFDInfo := fdInfo{fd: -1, isSocket: false} sentPackets := 0 for _, pkt := range pkts.AsSlice() { @@ -801,7 +801,7 @@ func (e *InjectableEndpoint) Attach(dispatcher stack.NetworkDispatcher) { // InjectInbound injects an inbound packet. If the endpoint is not attached, the // packet is not delivered. -func (e *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.mu.RLock() d := e.dispatcher e.mu.RUnlock() diff --git a/pkg/tcpip/link/fdbased/endpoint_test.go b/pkg/tcpip/link/fdbased/endpoint_test.go index cf179937a..3081eb406 100644 --- a/pkg/tcpip/link/fdbased/endpoint_test.go +++ b/pkg/tcpip/link/fdbased/endpoint_test.go @@ -47,7 +47,7 @@ const ( type packetInfo struct { Proto tcpip.NetworkProtocolNumber - Contents stack.PacketBufferPtr + Contents *stack.PacketBuffer } type packetContents struct { @@ -61,7 +61,7 @@ func checkPacketInfoEqual(t *testing.T, got, want packetInfo) { t.Helper() if diff := cmp.Diff( want, got, - cmp.Transformer("ExtractPacketBuffer", func(pk stack.PacketBufferPtr) *packetContents { + cmp.Transformer("ExtractPacketBuffer", func(pk *stack.PacketBuffer) *packetContents { if pk.IsNil() { return nil } @@ -132,12 +132,12 @@ func (c *context) cleanup() { } } -func (c *context) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (c *context) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { pkt.IncRef() c.ch <- packetInfo{protocol, pkt} } -func (c *context) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (c *context) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { c.t.Fatal("DeliverLinkPacket not implemented") } @@ -567,15 +567,15 @@ func TestIovecBufferSkipVnetHdr(t *testing.T) { // fakeNetworkDispatcher delivers packets to pkts. type fakeNetworkDispatcher struct { - pkts []stack.PacketBufferPtr + pkts []*stack.PacketBuffer } -func (d *fakeNetworkDispatcher) DeliverNetworkPacket(_ tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (d *fakeNetworkDispatcher) DeliverNetworkPacket(_ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { pkt.IncRef() d.pkts = append(d.pkts, pkt) } -func (*fakeNetworkDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (*fakeNetworkDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { panic("not implemented") } diff --git a/pkg/tcpip/link/loopback/loopback.go b/pkg/tcpip/link/loopback/loopback.go index a522dfcc2..f9f74203b 100644 --- a/pkg/tcpip/link/loopback/loopback.go +++ b/pkg/tcpip/link/loopback/loopback.go @@ -108,7 +108,7 @@ func (*endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint. -func (*endpoint) AddHeader(stack.PacketBufferPtr) {} +func (*endpoint) AddHeader(*stack.PacketBuffer) {} // ParseHeader implements stack.LinkEndpoint. -func (*endpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*endpoint) ParseHeader(*stack.PacketBuffer) bool { return true } diff --git a/pkg/tcpip/link/muxed/injectable.go b/pkg/tcpip/link/muxed/injectable.go index 26990ba28..51c675e70 100644 --- a/pkg/tcpip/link/muxed/injectable.go +++ b/pkg/tcpip/link/muxed/injectable.go @@ -90,7 +90,7 @@ func (m *InjectableEndpoint) IsAttached() bool { } // InjectInbound implements stack.InjectableLinkEndpoint. -func (m *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (m *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { m.mu.RLock() d := m.dispatcher m.mu.RUnlock() @@ -145,10 +145,10 @@ func (*InjectableEndpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (*InjectableEndpoint) AddHeader(stack.PacketBufferPtr) {} +func (*InjectableEndpoint) AddHeader(*stack.PacketBuffer) {} // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (*InjectableEndpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*InjectableEndpoint) ParseHeader(*stack.PacketBuffer) bool { return true } // NewInjectableEndpoint creates a new multi-endpoint injectable endpoint. func NewInjectableEndpoint(routes map[tcpip.Address]stack.InjectableLinkEndpoint) *InjectableEndpoint { diff --git a/pkg/tcpip/link/nested/nested.go b/pkg/tcpip/link/nested/nested.go index b20ce9004..0f04483ad 100644 --- a/pkg/tcpip/link/nested/nested.go +++ b/pkg/tcpip/link/nested/nested.go @@ -51,7 +51,7 @@ func (e *Endpoint) Init(child stack.LinkEndpoint, embedder stack.NetworkDispatch } // DeliverNetworkPacket implements stack.NetworkDispatcher. -func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.mu.RLock() d := e.dispatcher e.mu.RUnlock() @@ -61,7 +61,7 @@ func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pk } // DeliverLinkPacket implements stack.NetworkDispatcher. -func (e *Endpoint) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.mu.RLock() d := e.dispatcher e.mu.RUnlock() @@ -144,11 +144,11 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *Endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *Endpoint) AddHeader(pkt *stack.PacketBuffer) { e.child.AddHeader(pkt) } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (e *Endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (e *Endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { return e.child.ParseHeader(pkt) } diff --git a/pkg/tcpip/link/nested/nested_test.go b/pkg/tcpip/link/nested/nested_test.go index dca401a0c..f4b80da32 100644 --- a/pkg/tcpip/link/nested/nested_test.go +++ b/pkg/tcpip/link/nested/nested_test.go @@ -53,11 +53,11 @@ type counterDispatcher struct { var _ stack.NetworkDispatcher = (*counterDispatcher)(nil) -func (d *counterDispatcher) DeliverNetworkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (d *counterDispatcher) DeliverNetworkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { d.count++ } -func (*counterDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (*counterDispatcher) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { panic("not implemented") } diff --git a/pkg/tcpip/link/packetsocket/packetsocket.go b/pkg/tcpip/link/packetsocket/packetsocket.go index d309f6538..16284360a 100644 --- a/pkg/tcpip/link/packetsocket/packetsocket.go +++ b/pkg/tcpip/link/packetsocket/packetsocket.go @@ -40,7 +40,7 @@ func New(lower stack.LinkEndpoint) stack.LinkEndpoint { } // DeliverNetworkPacket implements stack.NetworkDispatcher. -func (e *endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.Endpoint.DeliverLinkPacket(protocol, pkt) e.Endpoint.DeliverNetworkPacket(protocol, pkt) diff --git a/pkg/tcpip/link/packetsocket/packetsocket_test.go b/pkg/tcpip/link/packetsocket/packetsocket_test.go index 655497ca4..df086356e 100644 --- a/pkg/tcpip/link/packetsocket/packetsocket_test.go +++ b/pkg/tcpip/link/packetsocket/packetsocket_test.go @@ -52,18 +52,18 @@ func (e *nullEndpoint) Attach(d stack.NetworkDispatcher) { e.disp = d } func (e *nullEndpoint) IsAttached() bool { return e.disp != nil } func (*nullEndpoint) Wait() {} func (*nullEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone } -func (*nullEndpoint) AddHeader(stack.PacketBufferPtr) {} -func (*nullEndpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*nullEndpoint) AddHeader(*stack.PacketBuffer) {} +func (*nullEndpoint) ParseHeader(*stack.PacketBuffer) bool { return true } var _ stack.NetworkDispatcher = (*testNetworkDispatcher)(nil) type linkPacketInfo struct { - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer protocol tcpip.NetworkProtocolNumber } type networkPacketInfo struct { - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer protocol tcpip.NetworkProtocolNumber } @@ -86,7 +86,7 @@ func (t *testNetworkDispatcher) reset() { *t = testNetworkDispatcher{} } -func (t *testNetworkDispatcher) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (t *testNetworkDispatcher) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { networkPacket := networkPacketInfo{ pkt: pkt.IncRef(), protocol: protocol, @@ -99,7 +99,7 @@ func (t *testNetworkDispatcher) DeliverNetworkPacket(protocol tcpip.NetworkProto t.networkPacket = networkPacket } -func (t *testNetworkDispatcher) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (t *testNetworkDispatcher) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { linkPacket := linkPacketInfo{ pkt: pkt.IncRef(), protocol: protocol, diff --git a/pkg/tcpip/link/pipe/pipe.go b/pkg/tcpip/link/pipe/pipe.go index f2c4858ed..bc0f58725 100644 --- a/pkg/tcpip/link/pipe/pipe.go +++ b/pkg/tcpip/link/pipe/pipe.go @@ -122,7 +122,7 @@ func (*Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint. -func (*Endpoint) AddHeader(stack.PacketBufferPtr) {} +func (*Endpoint) AddHeader(*stack.PacketBuffer) {} // ParseHeader implements stack.LinkEndpoint. -func (*Endpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*Endpoint) ParseHeader(*stack.PacketBuffer) bool { return true } diff --git a/pkg/tcpip/link/qdisc/fifo/fifo.go b/pkg/tcpip/link/qdisc/fifo/fifo.go index ca3932f98..299fc08f0 100644 --- a/pkg/tcpip/link/qdisc/fifo/fifo.go +++ b/pkg/tcpip/link/qdisc/fifo/fifo.go @@ -127,7 +127,7 @@ func (qd *queueDispatcher) dispatchLoop() { // - pkt.EgressRoute // - pkt.GSOOptions // - pkt.NetworkProtocolNumber -func (d *discipline) WritePacket(pkt stack.PacketBufferPtr) tcpip.Error { +func (d *discipline) WritePacket(pkt *stack.PacketBuffer) tcpip.Error { if d.closed.Load() == qDiscClosed { return &tcpip.ErrClosedForSend{} } diff --git a/pkg/tcpip/link/qdisc/fifo/packet_buffer_circular_list.go b/pkg/tcpip/link/qdisc/fifo/packet_buffer_circular_list.go index 462ec058b..5b3030b05 100644 --- a/pkg/tcpip/link/qdisc/fifo/packet_buffer_circular_list.go +++ b/pkg/tcpip/link/qdisc/fifo/packet_buffer_circular_list.go @@ -23,14 +23,14 @@ import "gvisor.dev/gvisor/pkg/tcpip/stack" // // +stateify savable type packetBufferCircularList struct { - pbs []stack.PacketBufferPtr + pbs []*stack.PacketBuffer head int size int } // init initializes the list with the given size. func (pl *packetBufferCircularList) init(size int) { - pl.pbs = make([]stack.PacketBufferPtr, size) + pl.pbs = make([]*stack.PacketBuffer, size) } // length returns the number of elements in the list. @@ -60,7 +60,7 @@ func (pl *packetBufferCircularList) isEmpty() bool { // Failing to do so may clobber existing entries. // //go:nosplit -func (pl *packetBufferCircularList) pushBack(pb stack.PacketBufferPtr) { +func (pl *packetBufferCircularList) pushBack(pb *stack.PacketBuffer) { next := (pl.head + pl.size) % len(pl.pbs) pl.pbs[next] = pb pl.size++ @@ -69,7 +69,7 @@ func (pl *packetBufferCircularList) pushBack(pb stack.PacketBufferPtr) { // removeFront returns the first element of the list or nil. // //go:nosplit -func (pl *packetBufferCircularList) removeFront() stack.PacketBufferPtr { +func (pl *packetBufferCircularList) removeFront() *stack.PacketBuffer { if pl.isEmpty() { return nil } diff --git a/pkg/tcpip/link/sharedmem/server_tx.go b/pkg/tcpip/link/sharedmem/server_tx.go index 9b6ce4b62..6c94b5ec7 100644 --- a/pkg/tcpip/link/sharedmem/server_tx.go +++ b/pkg/tcpip/link/sharedmem/server_tx.go @@ -159,7 +159,7 @@ func (s *serverTx) fillPacket(pktBuffer buffer.Buffer, buffers []queue.RxBuffer) return bufs, totalCopied } -func (s *serverTx) transmit(pkt stack.PacketBufferPtr) bool { +func (s *serverTx) transmit(pkt *stack.PacketBuffer) bool { buffers := make([]queue.RxBuffer, 8) buffers, totalCopied := s.fillPacket(pkt.ToBuffer(), buffers) if totalCopied == 0 { diff --git a/pkg/tcpip/link/sharedmem/sharedmem.go b/pkg/tcpip/link/sharedmem/sharedmem.go index 2265ae089..7b46c7992 100644 --- a/pkg/tcpip/link/sharedmem/sharedmem.go +++ b/pkg/tcpip/link/sharedmem/sharedmem.go @@ -340,7 +340,7 @@ func (e *endpoint) LinkAddress() tcpip.LinkAddress { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *endpoint) AddHeader(pkt *stack.PacketBuffer) { // Add ethernet header if needed. if len(e.addr) == 0 { return @@ -354,13 +354,13 @@ func (e *endpoint) AddHeader(pkt stack.PacketBufferPtr) { }) } -func (e *endpoint) parseHeader(pkt stack.PacketBufferPtr) bool { +func (e *endpoint) parseHeader(pkt *stack.PacketBuffer) bool { _, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize) return ok } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (e *endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (e *endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { // Add ethernet header if needed. if len(e.addr) == 0 { return true @@ -369,13 +369,13 @@ func (e *endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { return e.parseHeader(pkt) } -func (e *endpoint) AddVirtioNetHeader(pkt stack.PacketBufferPtr) { +func (e *endpoint) AddVirtioNetHeader(pkt *stack.PacketBuffer) { virtio := header.VirtioNetHeader(pkt.VirtioNetHeader().Push(header.VirtioNetHeaderSize)) virtio.Encode(&header.VirtioNetHeaderFields{}) } // +checklocks:e.mu -func (e *endpoint) writePacketLocked(r stack.RouteInfo, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) writePacketLocked(r stack.RouteInfo, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) tcpip.Error { if e.virtioNetHeaderRequired { e.AddVirtioNetHeader(pkt) } diff --git a/pkg/tcpip/link/sharedmem/sharedmem_server.go b/pkg/tcpip/link/sharedmem/sharedmem_server.go index c0840bd34..36b2b9710 100644 --- a/pkg/tcpip/link/sharedmem/sharedmem_server.go +++ b/pkg/tcpip/link/sharedmem/sharedmem_server.go @@ -203,7 +203,7 @@ func (e *serverEndpoint) LinkAddress() tcpip.LinkAddress { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *serverEndpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *serverEndpoint) AddHeader(pkt *stack.PacketBuffer) { // Add ethernet header if needed. if len(e.addr) == 0 { return @@ -217,13 +217,13 @@ func (e *serverEndpoint) AddHeader(pkt stack.PacketBufferPtr) { }) } -func (e *serverEndpoint) parseHeader(pkt stack.PacketBufferPtr) bool { +func (e *serverEndpoint) parseHeader(pkt *stack.PacketBuffer) bool { _, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize) return ok } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (e *serverEndpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (e *serverEndpoint) ParseHeader(pkt *stack.PacketBuffer) bool { // Add ethernet header if needed. if len(e.addr) == 0 { return true @@ -232,13 +232,13 @@ func (e *serverEndpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { return e.parseHeader(pkt) } -func (e *serverEndpoint) AddVirtioNetHeader(pkt stack.PacketBufferPtr) { +func (e *serverEndpoint) AddVirtioNetHeader(pkt *stack.PacketBuffer) { virtio := header.VirtioNetHeader(pkt.VirtioNetHeader().Push(header.VirtioNetHeaderSize)) virtio.Encode(&header.VirtioNetHeaderFields{}) } // +checklocks:e.mu -func (e *serverEndpoint) writePacketLocked(r stack.RouteInfo, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *serverEndpoint) writePacketLocked(r stack.RouteInfo, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) tcpip.Error { if e.virtioNetHeaderRequired { e.AddVirtioNetHeader(pkt) } @@ -254,7 +254,7 @@ func (e *serverEndpoint) writePacketLocked(r stack.RouteInfo, protocol tcpip.Net // WritePacket writes outbound packets to the file descriptor. If it is not // currently writable, the packet is dropped. // WritePacket implements stack.LinkEndpoint.WritePacket. -func (e *serverEndpoint) WritePacket(_ stack.RouteInfo, _ tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *serverEndpoint) WritePacket(_ stack.RouteInfo, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) tcpip.Error { // Transmit the packet. e.mu.Lock() defer e.mu.Unlock() diff --git a/pkg/tcpip/link/sharedmem/sharedmem_test.go b/pkg/tcpip/link/sharedmem/sharedmem_test.go index eeee103cb..f3713a8c6 100644 --- a/pkg/tcpip/link/sharedmem/sharedmem_test.go +++ b/pkg/tcpip/link/sharedmem/sharedmem_test.go @@ -143,7 +143,7 @@ func newTestContext(t *testing.T, mtu, bufferSize uint32, addr tcpip.LinkAddress return c } -func (c *testContext) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (c *testContext) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { c.mu.Lock() c.packets = append(c.packets, packetInfo{ proto: proto, @@ -154,7 +154,7 @@ func (c *testContext) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pk c.packetCh <- struct{}{} } -func (c *testContext) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (c *testContext) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { c.t.Fatal("DeliverLinkPacket not implemented") } diff --git a/pkg/tcpip/link/sniffer/pcap.go b/pkg/tcpip/link/sniffer/pcap.go index 648852b24..491957ac8 100644 --- a/pkg/tcpip/link/sniffer/pcap.go +++ b/pkg/tcpip/link/sniffer/pcap.go @@ -50,7 +50,7 @@ var _ encoding.BinaryMarshaler = (*pcapPacket)(nil) type pcapPacket struct { timestamp time.Time - packet stack.PacketBufferPtr + packet *stack.PacketBuffer maxCaptureLen int } diff --git a/pkg/tcpip/link/sniffer/sniffer.go b/pkg/tcpip/link/sniffer/sniffer.go index 542509c76..b0424678e 100644 --- a/pkg/tcpip/link/sniffer/sniffer.go +++ b/pkg/tcpip/link/sniffer/sniffer.go @@ -133,12 +133,12 @@ func NewWithWriter(lower stack.LinkEndpoint, writer io.Writer, snapLen uint32) ( // DeliverNetworkPacket implements the stack.NetworkDispatcher interface. It is // called by the link-layer endpoint being wrapped when a packet arrives, and // logs the packet before forwarding to the actual dispatcher. -func (e *endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.dumpPacket(DirectionRecv, protocol, pkt) e.Endpoint.DeliverNetworkPacket(protocol, pkt) } -func (e *endpoint) dumpPacket(dir Direction, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *endpoint) dumpPacket(dir Direction, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { writer := e.writer if writer == nil && LogPackets.Load() == 1 { LogPacket(e.logPrefix, dir, protocol, pkt) @@ -170,7 +170,7 @@ func (e *endpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.Error) } // LogPacket logs a packet to stdout. -func LogPacket(prefix string, dir Direction, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func LogPacket(prefix string, dir Direction, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { // Figure out the network layer info. var transProto uint8 var src tcpip.Address @@ -380,7 +380,7 @@ func LogPacket(prefix string, dir Direction, protocol tcpip.NetworkProtocolNumbe // trimmedClone clones the packet buffer to not modify the original. It trims // anything before the network header. -func trimmedClone(pkt stack.PacketBufferPtr) stack.PacketBufferPtr { +func trimmedClone(pkt *stack.PacketBuffer) *stack.PacketBuffer { // We don't clone the original packet buffer so that the new packet buffer // does not have any of its headers set. // diff --git a/pkg/tcpip/link/tun/device.go b/pkg/tcpip/link/tun/device.go index 9928e0ce9..070338f7a 100644 --- a/pkg/tcpip/link/tun/device.go +++ b/pkg/tcpip/link/tun/device.go @@ -271,7 +271,7 @@ func (d *Device) Read() (*buffer.View, error) { } // encodePkt encodes packet for fd side. -func (d *Device) encodePkt(pkt stack.PacketBufferPtr) *buffer.View { +func (d *Device) encodePkt(pkt *stack.PacketBuffer) *buffer.View { var view *buffer.View // Packet information. @@ -359,7 +359,7 @@ func (e *tunEndpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *tunEndpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *tunEndpoint) AddHeader(pkt *stack.PacketBuffer) { if !e.isTap { return } diff --git a/pkg/tcpip/link/waitable/waitable.go b/pkg/tcpip/link/waitable/waitable.go index 7977e51b7..4447106dc 100644 --- a/pkg/tcpip/link/waitable/waitable.go +++ b/pkg/tcpip/link/waitable/waitable.go @@ -56,7 +56,7 @@ func New(lower stack.LinkEndpoint) *Endpoint { // It is called by the link-layer endpoint being wrapped when a packet arrives, // and only forwards to the actual dispatcher if Wait or WaitDispatch haven't // been called. -func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { if !e.dispatchGate.Enter() { return } @@ -70,7 +70,7 @@ func (e *Endpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pk } // DeliverLinkPacket implements stack.NetworkDispatcher. -func (e *Endpoint) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *Endpoint) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { if !e.dispatchGate.Enter() { return } @@ -158,11 +158,11 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *Endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (e *Endpoint) AddHeader(pkt *stack.PacketBuffer) { e.lower.AddHeader(pkt) } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (e *Endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (e *Endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { return e.lower.ParseHeader(pkt) } diff --git a/pkg/tcpip/link/waitable/waitable_test.go b/pkg/tcpip/link/waitable/waitable_test.go index b22f2b059..9f93bad05 100644 --- a/pkg/tcpip/link/waitable/waitable_test.go +++ b/pkg/tcpip/link/waitable/waitable_test.go @@ -39,11 +39,11 @@ type countedEndpoint struct { dispatcher stack.NetworkDispatcher } -func (e *countedEndpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *countedEndpoint) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { e.dispatchCount++ } -func (*countedEndpoint) DeliverLinkPacket(tcpip.NetworkProtocolNumber, stack.PacketBufferPtr) { +func (*countedEndpoint) DeliverLinkPacket(tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { panic("not implemented") } @@ -88,12 +88,12 @@ func (*countedEndpoint) ARPHardwareType() header.ARPHardwareType { func (*countedEndpoint) Wait() {} // AddHeader implements stack.LinkEndpoint.AddHeader. -func (*countedEndpoint) AddHeader(stack.PacketBufferPtr) { +func (*countedEndpoint) AddHeader(*stack.PacketBuffer) { panic("unimplemented") } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (*countedEndpoint) ParseHeader(stack.PacketBufferPtr) bool { +func (*countedEndpoint) ParseHeader(*stack.PacketBuffer) bool { panic("unimplemented") } diff --git a/pkg/tcpip/link/xdp/endpoint.go b/pkg/tcpip/link/xdp/endpoint.go index a5acc1a2c..fdbbdca08 100644 --- a/pkg/tcpip/link/xdp/endpoint.go +++ b/pkg/tcpip/link/xdp/endpoint.go @@ -241,7 +241,7 @@ func (ep *endpoint) Wait() { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (ep *endpoint) AddHeader(pkt stack.PacketBufferPtr) { +func (ep *endpoint) AddHeader(pkt *stack.PacketBuffer) { // Add ethernet header if needed. eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize)) eth.Encode(&header.EthernetFields{ @@ -252,7 +252,7 @@ func (ep *endpoint) AddHeader(pkt stack.PacketBufferPtr) { } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (ep *endpoint) ParseHeader(pkt stack.PacketBufferPtr) bool { +func (ep *endpoint) ParseHeader(pkt *stack.PacketBuffer) bool { _, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize) return ok } diff --git a/pkg/tcpip/network/arp/arp.go b/pkg/tcpip/network/arp/arp.go index ebcdf92df..d2ab16209 100644 --- a/pkg/tcpip/network/arp/arp.go +++ b/pkg/tcpip/network/arp/arp.go @@ -133,7 +133,7 @@ func (e *endpoint) MaxHeaderLength() uint16 { func (*endpoint) Close() {} -func (*endpoint) WritePacket(*stack.Route, stack.NetworkHeaderParams, stack.PacketBufferPtr) tcpip.Error { +func (*endpoint) WritePacket(*stack.Route, stack.NetworkHeaderParams, *stack.PacketBuffer) tcpip.Error { return &tcpip.ErrNotSupported{} } @@ -142,11 +142,11 @@ func (*endpoint) NetworkProtocolNumber() tcpip.NetworkProtocolNumber { return ProtocolNumber } -func (*endpoint) WriteHeaderIncludedPacket(*stack.Route, stack.PacketBufferPtr) tcpip.Error { +func (*endpoint) WriteHeaderIncludedPacket(*stack.Route, *stack.PacketBuffer) tcpip.Error { return &tcpip.ErrNotSupported{} } -func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(pkt *stack.PacketBuffer) { stats := e.stats.arp stats.packetsReceived.Increment() @@ -383,7 +383,7 @@ func (*protocol) Close() {} func (*protocol) Wait() {} // Parse implements stack.NetworkProtocol.Parse. -func (*protocol) Parse(pkt stack.PacketBufferPtr) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { +func (*protocol) Parse(pkt *stack.PacketBuffer) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { return 0, false, parse.ARP(pkt) } diff --git a/pkg/tcpip/network/internal/fragmentation/fragmentation.go b/pkg/tcpip/network/internal/fragmentation/fragmentation.go index 39dc5ad02..22f5806cf 100644 --- a/pkg/tcpip/network/internal/fragmentation/fragmentation.go +++ b/pkg/tcpip/network/internal/fragmentation/fragmentation.go @@ -97,7 +97,7 @@ type TimeoutHandler interface { // OnReassemblyTimeout will be called with the first fragment (or nil, if the // first fragment has not been received) of a packet whose reassembly has // timed out. - OnReassemblyTimeout(pkt stack.PacketBufferPtr) + OnReassemblyTimeout(pkt *stack.PacketBuffer) } // NewFragmentation creates a new Fragmentation. @@ -155,8 +155,8 @@ func NewFragmentation(blockSize uint16, highMemoryLimit, lowMemoryLimit int, rea // to be given here outside of the FragmentID struct because IPv6 should not use // the protocol to identify a fragment. func (f *Fragmentation) Process( - id FragmentID, first, last uint16, more bool, proto uint8, pkt stack.PacketBufferPtr) ( - stack.PacketBufferPtr, uint8, bool, error) { + id FragmentID, first, last uint16, more bool, proto uint8, pkt *stack.PacketBuffer) ( + *stack.PacketBuffer, uint8, bool, error) { if first > last { return nil, 0, false, fmt.Errorf("first=%d is greater than last=%d: %w", first, last, ErrInvalidArgs) } @@ -308,7 +308,7 @@ type PacketFragmenter struct { // // reserve is the number of bytes that should be reserved for the headers in // each generated fragment. -func MakePacketFragmenter(pkt stack.PacketBufferPtr, fragmentPayloadLen uint32, reserve int) PacketFragmenter { +func MakePacketFragmenter(pkt *stack.PacketBuffer, fragmentPayloadLen uint32, reserve int) PacketFragmenter { // As per RFC 8200 Section 4.5, some IPv6 extension headers should not be // repeated in each fragment. However we do not currently support any header // of that kind yet, so the following computation is valid for both IPv4 and @@ -339,7 +339,7 @@ func MakePacketFragmenter(pkt stack.PacketBufferPtr, fragmentPayloadLen uint32, // Note that the returned packet will not have its network and link headers // populated, but space for them will be reserved. The transport header will be // stored in the packet's data. -func (pf *PacketFragmenter) BuildNextFragment() (stack.PacketBufferPtr, int, int, bool) { +func (pf *PacketFragmenter) BuildNextFragment() (*stack.PacketBuffer, int, int, bool) { if pf.currentFragment >= pf.fragmentCount { panic("BuildNextFragment should not be called again after the last fragment was returned") } diff --git a/pkg/tcpip/network/internal/fragmentation/fragmentation_test.go b/pkg/tcpip/network/internal/fragmentation/fragmentation_test.go index d4ec6675a..f73da9be1 100644 --- a/pkg/tcpip/network/internal/fragmentation/fragmentation_test.go +++ b/pkg/tcpip/network/internal/fragmentation/fragmentation_test.go @@ -43,7 +43,7 @@ func buf(size int, pieces ...string) buffer.Buffer { return buf } -func pkt(size int, pieces ...string) stack.PacketBufferPtr { +func pkt(size int, pieces ...string) *stack.PacketBuffer { return stack.NewPacketBuffer(stack.PacketBufferOptions{ Payload: buf(size, pieces...), }) @@ -55,7 +55,7 @@ type processInput struct { last uint16 more bool proto uint8 - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } type processOutput struct { @@ -578,10 +578,10 @@ func TestPacketFragmenter(t *testing.T) { } type testTimeoutHandler struct { - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } -func (h *testTimeoutHandler) OnReassemblyTimeout(pkt stack.PacketBufferPtr) { +func (h *testTimeoutHandler) OnReassemblyTimeout(pkt *stack.PacketBuffer) { h.pkt = pkt } @@ -599,14 +599,14 @@ func TestTimeoutHandler(t *testing.T) { first uint16 last uint16 more bool - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } tests := []struct { name string params []processParam wantError bool - wantPkt stack.PacketBufferPtr + wantPkt *stack.PacketBuffer }{ { name: "onTimeout runs", diff --git a/pkg/tcpip/network/internal/fragmentation/reassembler.go b/pkg/tcpip/network/internal/fragmentation/reassembler.go index 873e034f6..42c42e082 100644 --- a/pkg/tcpip/network/internal/fragmentation/reassembler.go +++ b/pkg/tcpip/network/internal/fragmentation/reassembler.go @@ -30,7 +30,7 @@ type hole struct { final bool // pkt is the fragment packet if hole is filled. We keep the whole pkt rather // than the fragmented payload to prevent binding to specific buffer types. - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } type reassembler struct { @@ -43,7 +43,7 @@ type reassembler struct { filled int done bool createdAt tcpip.MonotonicTime - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } func newReassembler(id FragmentID, clock tcpip.Clock) *reassembler { @@ -60,7 +60,7 @@ func newReassembler(id FragmentID, clock tcpip.Clock) *reassembler { return r } -func (r *reassembler) process(first, last uint16, more bool, proto uint8, pkt stack.PacketBufferPtr) (stack.PacketBufferPtr, uint8, bool, int, error) { +func (r *reassembler) process(first, last uint16, more bool, proto uint8, pkt *stack.PacketBuffer) (*stack.PacketBuffer, uint8, bool, int, error) { r.mu.Lock() defer r.mu.Unlock() if r.done { diff --git a/pkg/tcpip/network/internal/fragmentation/reassembler_test.go b/pkg/tcpip/network/internal/fragmentation/reassembler_test.go index 08102f34d..c189d484b 100644 --- a/pkg/tcpip/network/internal/fragmentation/reassembler_test.go +++ b/pkg/tcpip/network/internal/fragmentation/reassembler_test.go @@ -29,7 +29,7 @@ type processParams struct { first uint16 last uint16 more bool - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer wantDone bool wantError error } @@ -45,7 +45,7 @@ func TestReassemblerProcess(t *testing.T) { return payload } - pkt := func(sizes ...int) stack.PacketBufferPtr { + pkt := func(sizes ...int) *stack.PacketBuffer { var buf buffer.Buffer for _, size := range sizes { buf.Append(v(size)) @@ -59,7 +59,7 @@ func TestReassemblerProcess(t *testing.T) { name string params []processParams want []hole - wantPkt stack.PacketBufferPtr + wantPkt *stack.PacketBuffer }{ { name: "No fragments", @@ -199,7 +199,7 @@ func TestReassemblerProcess(t *testing.T) { r.pkt.DecRef() } }() - var resPkt stack.PacketBufferPtr + var resPkt *stack.PacketBuffer var isDone bool for _, param := range test.params { pkt, _, done, _, err := r.process(param.first, param.last, param.more, proto, param.pkt) @@ -215,8 +215,8 @@ func TestReassemblerProcess(t *testing.T) { } } - ignorePkt := func(a, b stack.PacketBufferPtr) bool { return true } - cmpPktData := func(a, b stack.PacketBufferPtr) bool { + ignorePkt := func(a, b *stack.PacketBuffer) bool { return true } + cmpPktData := func(a, b *stack.PacketBuffer) bool { if a.IsNil() || b.IsNil() { return a == b } diff --git a/pkg/tcpip/network/internal/multicast/example_test.go b/pkg/tcpip/network/internal/multicast/example_test.go index dd3dcfaa0..5d60573cd 100644 --- a/pkg/tcpip/network/internal/multicast/example_test.go +++ b/pkg/tcpip/network/internal/multicast/example_test.go @@ -114,7 +114,7 @@ func Example() { // Last used timestamp: 10000000000 } -func forwardPkt(stack.PacketBufferPtr, *multicast.InstalledRoute) { +func forwardPkt(*stack.PacketBuffer, *multicast.InstalledRoute) { fmt.Println("forwardPkt") } @@ -122,11 +122,11 @@ func emitMissingRouteEvent(stack.UnicastSourceAndMulticastDestination) { fmt.Println("emitMissingRouteEvent") } -func deliverPktLocally(stack.PacketBufferPtr) { +func deliverPktLocally(*stack.PacketBuffer) { fmt.Println("deliverPktLocally") } -func newPacketBuffer(body string) stack.PacketBufferPtr { +func newPacketBuffer(body string) *stack.PacketBuffer { return stack.NewPacketBuffer(stack.PacketBufferOptions{ Payload: buffer.MakeWithData([]byte(body)), }) diff --git a/pkg/tcpip/network/internal/multicast/route_table.go b/pkg/tcpip/network/internal/multicast/route_table.go index 5bade5ae7..41227e6ed 100644 --- a/pkg/tcpip/network/internal/multicast/route_table.go +++ b/pkg/tcpip/network/internal/multicast/route_table.go @@ -116,7 +116,7 @@ func (r *InstalledRoute) SetLastUsedTimestamp(monotonicTime tcpip.MonotonicTime) // for the entry. For such routes, packets are added to an expiring queue until // a route is installed. type PendingRoute struct { - packets []stack.PacketBufferPtr + packets []*stack.PacketBuffer // expiration is the timestamp at which the pending route should be expired. // @@ -265,7 +265,7 @@ func (r *RouteTable) cleanupPendingRoutes() { func (r *RouteTable) newPendingRoute() PendingRoute { return PendingRoute{ - packets: make([]stack.PacketBufferPtr, 0, r.config.MaxPendingQueueSize), + packets: make([]*stack.PacketBuffer, 0, r.config.MaxPendingQueueSize), expiration: r.config.Clock.NowMonotonic().Add(DefaultPendingRouteExpiration), } } @@ -326,7 +326,7 @@ func (e GetRouteResultState) String() string { // // If the relevant pending route queue is at max capacity, then returns false. // Otherwise, returns true. -func (r *RouteTable) GetRouteOrInsertPending(key stack.UnicastSourceAndMulticastDestination, pkt stack.PacketBufferPtr) (GetRouteResult, bool) { +func (r *RouteTable) GetRouteOrInsertPending(key stack.UnicastSourceAndMulticastDestination, pkt *stack.PacketBuffer) (GetRouteResult, bool) { r.installedMu.RLock() defer r.installedMu.RUnlock() @@ -374,7 +374,7 @@ func (r *RouteTable) getOrCreatePendingRouteRLocked(key stack.UnicastSourceAndMu // returned. The caller assumes ownership of these packets and is responsible // for forwarding and releasing them. If an installed route already exists for // the provided key, then it is overwritten. -func (r *RouteTable) AddInstalledRoute(key stack.UnicastSourceAndMulticastDestination, route *InstalledRoute) []stack.PacketBufferPtr { +func (r *RouteTable) AddInstalledRoute(key stack.UnicastSourceAndMulticastDestination, route *InstalledRoute) []*stack.PacketBuffer { r.installedMu.Lock() defer r.installedMu.Unlock() r.installedRoutes[key] = route diff --git a/pkg/tcpip/network/internal/multicast/route_table_test.go b/pkg/tcpip/network/internal/multicast/route_table_test.go index 242433ef2..631ed309c 100644 --- a/pkg/tcpip/network/internal/multicast/route_table_test.go +++ b/pkg/tcpip/network/internal/multicast/route_table_test.go @@ -44,7 +44,7 @@ var ( defaultRoute = stack.MulticastRoute{inputNICID, defaultOutgoingInterfaces} ) -func newPacketBuffer(body string) stack.PacketBufferPtr { +func newPacketBuffer(body string) *stack.PacketBuffer { return stack.NewPacketBuffer(stack.PacketBufferOptions{ Payload: buffer.MakeWithData([]byte(body)), }) @@ -257,7 +257,7 @@ func TestAddInstalledRouteWithPending(t *testing.T) { defer pkt.DecRef() cmpOpts := []cmp.Option{ - cmp.Transformer("AsSlices", func(pkt stack.PacketBufferPtr) [][]byte { + cmp.Transformer("AsSlices", func(pkt *stack.PacketBuffer) [][]byte { return pkt.AsSlices() }), cmp.Comparer(func(a [][]byte, b [][]byte) bool { @@ -268,12 +268,12 @@ func TestAddInstalledRouteWithPending(t *testing.T) { testCases := []struct { name string advance time.Duration - want []stack.PacketBufferPtr + want []*stack.PacketBuffer }{ { name: "not expired", advance: DefaultPendingRouteExpiration, - want: []stack.PacketBufferPtr{pkt}, + want: []*stack.PacketBuffer{pkt}, }, { name: "expired", diff --git a/pkg/tcpip/network/internal/testutil/testutil.go b/pkg/tcpip/network/internal/testutil/testutil.go index 390eaa50e..0bbba1116 100644 --- a/pkg/tcpip/network/internal/testutil/testutil.go +++ b/pkg/tcpip/network/internal/testutil/testutil.go @@ -34,7 +34,7 @@ import ( // to it and can mock errors. type MockLinkEndpoint struct { // WrittenPackets is where packets written to the endpoint are stored. - WrittenPackets []stack.PacketBufferPtr + WrittenPackets []*stack.PacketBuffer mtu uint32 err tcpip.Error @@ -92,10 +92,10 @@ func (*MockLinkEndpoint) Wait() {} func (*MockLinkEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone } // AddHeader implements LinkEndpoint.AddHeader. -func (*MockLinkEndpoint) AddHeader(stack.PacketBufferPtr) {} +func (*MockLinkEndpoint) AddHeader(*stack.PacketBuffer) {} // ParseHeader implements LinkEndpoint.ParseHeader. -func (*MockLinkEndpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*MockLinkEndpoint) ParseHeader(*stack.PacketBuffer) bool { return true } // Close releases all resources. func (ep *MockLinkEndpoint) Close() { @@ -110,7 +110,7 @@ func (ep *MockLinkEndpoint) Close() { // extraHeaderReserveLength indicates how much extra space will be reserved for // the other headers. The payload is made from Views of the sizes listed in // viewSizes. -func MakeRandPkt(transportHeaderLength int, extraHeaderReserveLength int, viewSizes []int, proto tcpip.NetworkProtocolNumber) stack.PacketBufferPtr { +func MakeRandPkt(transportHeaderLength int, extraHeaderReserveLength int, viewSizes []int, proto tcpip.NetworkProtocolNumber) *stack.PacketBuffer { var buf buffer.Buffer for _, s := range viewSizes { diff --git a/pkg/tcpip/network/ip_test.go b/pkg/tcpip/network/ip_test.go index 7d890a9ba..7224107c1 100644 --- a/pkg/tcpip/network/ip_test.go +++ b/pkg/tcpip/network/ip_test.go @@ -127,7 +127,7 @@ func (t *testObject) checkValues(protocol tcpip.TransportProtocolNumber, v []byt // DeliverTransportPacket is called by network endpoints after parsing incoming // packets. This is used by the test object to verify that the results of the // parsing are expected. -func (t *testObject) DeliverTransportPacket(protocol tcpip.TransportProtocolNumber, pkt stack.PacketBufferPtr) stack.TransportPacketDisposition { +func (t *testObject) DeliverTransportPacket(protocol tcpip.TransportProtocolNumber, pkt *stack.PacketBuffer) stack.TransportPacketDisposition { netHdr := pkt.Network() v := pkt.Data().AsRange().ToView() defer v.Release() @@ -139,7 +139,7 @@ func (t *testObject) DeliverTransportPacket(protocol tcpip.TransportProtocolNumb // DeliverTransportError is called by network endpoints after parsing // incoming control (ICMP) packets. This is used by the test object to verify // that the results of the parsing are expected. -func (t *testObject) DeliverTransportError(local, remote tcpip.Address, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (t *testObject) DeliverTransportError(local, remote tcpip.Address, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr stack.TransportError, pkt *stack.PacketBuffer) { v := pkt.Data().AsRange().ToView() defer v.Release() t.checkValues(trans, v.AsSlice(), remote, local) @@ -159,7 +159,7 @@ func (t *testObject) DeliverTransportError(local, remote tcpip.Address, net tcpi t.controlCalls++ } -func (t *testObject) DeliverRawPacket(tcpip.TransportProtocolNumber, stack.PacketBufferPtr) { +func (t *testObject) DeliverRawPacket(tcpip.TransportProtocolNumber, *stack.PacketBuffer) { t.rawCalls++ } @@ -198,7 +198,7 @@ func (*testObject) Wait() {} // WritePacket is called by network endpoints after producing a packet and // writing it to the link endpoint. This is used by the test object to verify // that the produced packet is as expected. -func (t *testObject) WritePacket(_ *stack.Route, pkt stack.PacketBufferPtr) tcpip.Error { +func (t *testObject) WritePacket(_ *stack.Route, pkt *stack.PacketBuffer) tcpip.Error { var prot tcpip.TransportProtocolNumber var srcAddr tcpip.Address var dstAddr tcpip.Address @@ -225,12 +225,12 @@ func (*testObject) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (*testObject) AddHeader(stack.PacketBufferPtr) { +func (*testObject) AddHeader(*stack.PacketBuffer) { panic("not implemented") } // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (*testObject) ParseHeader(stack.PacketBufferPtr) bool { +func (*testObject) ParseHeader(*stack.PacketBuffer) bool { panic("not implemented") } @@ -359,7 +359,7 @@ func (t *testInterface) setEnabled(v bool) { t.mu.disabled = !v } -func (*testInterface) WritePacketToRemote(tcpip.LinkAddress, stack.PacketBufferPtr) tcpip.Error { +func (*testInterface) WritePacketToRemote(tcpip.LinkAddress, *stack.PacketBuffer) tcpip.Error { return &tcpip.ErrNotSupported{} } @@ -1322,7 +1322,7 @@ func TestIPv6ReceiveControl(t *testing.T) { // after truncation, is large enough to hold a network header, it makes part of // view the packet's NetworkHeader and the rest its Data. Otherwise all of view // becomes Data. -func truncatedPacket(view []byte, trunc, netHdrLen int) stack.PacketBufferPtr { +func truncatedPacket(view []byte, trunc, netHdrLen int) *stack.PacketBuffer { v := view[:len(view)-trunc] pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{ Payload: buffer.MakeWithData(v), @@ -1374,7 +1374,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { nicAddr tcpip.AddressWithPrefix remoteAddr tcpip.Address pktGen func(*testing.T, tcpip.Address) buffer.Buffer - checker func(*testing.T, stack.PacketBufferPtr, tcpip.Address) + checker func(*testing.T, *stack.PacketBuffer, tcpip.Address) expectedErr tcpip.Error }{ { @@ -1398,7 +1398,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(hdr.View()) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv4Any { src = localIPv4Addr } @@ -1478,7 +1478,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(ip) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv4Any { src = localIPv4Addr } @@ -1523,7 +1523,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(hdr.View()) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv4Any { src = localIPv4Addr } @@ -1566,7 +1566,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { buf.Append(buffer.NewViewWithData(data)) return buf }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv4Any { src = localIPv4Addr } @@ -1611,7 +1611,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(hdr.View()) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv6Any { src = localIPv6Addr } @@ -1658,7 +1658,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(hdr.View()) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv6Any { src = localIPv6Addr } @@ -1695,7 +1695,7 @@ func TestWriteHeaderIncludedPacket(t *testing.T) { }) return buffer.MakeWithData(ip) }, - checker: func(t *testing.T, pkt stack.PacketBufferPtr, src tcpip.Address) { + checker: func(t *testing.T, pkt *stack.PacketBuffer, src tcpip.Address) { if src == header.IPv6Any { src = localIPv6Addr } @@ -1879,7 +1879,7 @@ func TestICMPInclusionSize(t *testing.T) { return v } - v4Checker := func(t *testing.T, pkt stack.PacketBufferPtr, payload []byte) { + v4Checker := func(t *testing.T, pkt *stack.PacketBuffer, payload []byte) { // We already know the entire packet is the right size so we can use its // length to calculate the right payload size to check. expectedPayloadLength := pkt.Size() - header.IPv4MinimumSize - header.ICMPv4MinimumSize @@ -1899,7 +1899,7 @@ func TestICMPInclusionSize(t *testing.T) { ) } - v6Checker := func(t *testing.T, pkt stack.PacketBufferPtr, payload []byte) { + v6Checker := func(t *testing.T, pkt *stack.PacketBuffer, payload []byte) { // We already know the entire packet is the right size so we can use its // length to calculate the right payload size to check. expectedPayloadLength := pkt.Size() - header.IPv6MinimumSize - header.ICMPv6MinimumSize @@ -1920,7 +1920,7 @@ func TestICMPInclusionSize(t *testing.T) { name string srcAddress tcpip.Address injector func(*channel.Endpoint, tcpip.Address, []byte) []byte - checker func(*testing.T, stack.PacketBufferPtr, []byte) + checker func(*testing.T, *stack.PacketBuffer, []byte) payloadLength int // Not including IP header. linkMTU uint32 // Largest IP packet that the link can send as payload. replyLength int // Total size of IP/ICMP packet expected back. diff --git a/pkg/tcpip/network/ipv4/icmp.go b/pkg/tcpip/network/ipv4/icmp.go index 875eca473..09e500bc9 100644 --- a/pkg/tcpip/network/ipv4/icmp.go +++ b/pkg/tcpip/network/ipv4/icmp.go @@ -243,7 +243,7 @@ func (e *endpoint) checkLocalAddress(addr tcpip.Address) bool { // of the original packet that caused the ICMP one to be sent. This information // is used to find out which transport endpoint must be notified about the ICMP // packet. We only expect the payload, not the enclosing ICMP packet. -func (e *endpoint) handleControl(errInfo stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) handleControl(errInfo stack.TransportError, pkt *stack.PacketBuffer) { h, ok := pkt.Data().PullUp(header.IPv4MinimumSize) if !ok { return @@ -280,7 +280,7 @@ func (e *endpoint) handleControl(errInfo stack.TransportError, pkt stack.PacketB e.dispatcher.DeliverTransportError(srcAddr, dstAddr, ProtocolNumber, p, errInfo, pkt) } -func (e *endpoint) handleICMP(pkt stack.PacketBufferPtr) { +func (e *endpoint) handleICMP(pkt *stack.PacketBuffer) { received := e.stats.icmp.packetsReceived h := header.ICMPv4(pkt.TransportHeader().Slice()) if len(h) < header.ICMPv4MinimumSize { @@ -607,7 +607,7 @@ func (*icmpReasonHostUnreachable) isICMPReason() {} // the problematic packet. It incorporates as much of that packet as // possible as well as any error metadata as is available. returnError // expects pkt to hold a valid IPv4 packet as per the wire format. -func (p *protocol) returnError(reason icmpReason, pkt stack.PacketBufferPtr, deliveredLocally bool) tcpip.Error { +func (p *protocol) returnError(reason icmpReason, pkt *stack.PacketBuffer, deliveredLocally bool) tcpip.Error { origIPHdr := header.IPv4(pkt.NetworkHeader().Slice()) origIPHdrSrc := origIPHdr.SourceAddress() origIPHdrDst := origIPHdr.DestinationAddress() @@ -807,7 +807,7 @@ func (p *protocol) returnError(reason icmpReason, pkt stack.PacketBufferPtr, del } // OnReassemblyTimeout implements fragmentation.TimeoutHandler. -func (p *protocol) OnReassemblyTimeout(pkt stack.PacketBufferPtr) { +func (p *protocol) OnReassemblyTimeout(pkt *stack.PacketBuffer) { // OnReassemblyTimeout sends a Time Exceeded Message, as per RFC 792: // // If a host reassembling a fragmented datagram cannot complete the diff --git a/pkg/tcpip/network/ipv4/igmp.go b/pkg/tcpip/network/ipv4/igmp.go index d9eb62316..afbe4d386 100644 --- a/pkg/tcpip/network/ipv4/igmp.go +++ b/pkg/tcpip/network/ipv4/igmp.go @@ -328,7 +328,7 @@ func (igmp *igmpState) isSourceIPValidLocked(src tcpip.Address, messageType head } // +checklocks:igmp.ep.mu -func (igmp *igmpState) isPacketValidLocked(pkt stack.PacketBufferPtr, messageType header.IGMPType, hasRouterAlertOption bool) bool { +func (igmp *igmpState) isPacketValidLocked(pkt *stack.PacketBuffer, messageType header.IGMPType, hasRouterAlertOption bool) bool { // We can safely assume that the IP header is valid if we got this far. iph := header.IPv4(pkt.NetworkHeader().Slice()) @@ -346,7 +346,7 @@ func (igmp *igmpState) isPacketValidLocked(pkt stack.PacketBufferPtr, messageTyp // handleIGMP handles an IGMP packet. // // +checklocks:igmp.ep.mu -func (igmp *igmpState) handleIGMP(pkt stack.PacketBufferPtr, hasRouterAlertOption bool) { +func (igmp *igmpState) handleIGMP(pkt *stack.PacketBuffer, hasRouterAlertOption bool) { received := igmp.ep.stats.igmp.packetsReceived hdr, ok := pkt.Data().PullUp(pkt.Data().Size()) if !ok { diff --git a/pkg/tcpip/network/ipv4/igmp_test.go b/pkg/tcpip/network/ipv4/igmp_test.go index 62d9d1474..df0460656 100644 --- a/pkg/tcpip/network/ipv4/igmp_test.go +++ b/pkg/tcpip/network/ipv4/igmp_test.go @@ -51,7 +51,7 @@ var ( // validateIgmpPacket checks that a passed packet is an IPv4 IGMP packet sent // to the provided address with the passed fields set. Raises a t.Error if any // field does not match. -func validateIgmpPacket(t *testing.T, pkt stack.PacketBufferPtr, igmpType header.IGMPType, maxRespTime byte, srcAddr, dstAddr, groupAddress tcpip.Address) { +func validateIgmpPacket(t *testing.T, pkt *stack.PacketBuffer, igmpType header.IGMPType, maxRespTime byte, srcAddr, dstAddr, groupAddress tcpip.Address) { t.Helper() payload := stack.PayloadSince(pkt.NetworkHeader()) @@ -70,7 +70,7 @@ func validateIgmpPacket(t *testing.T, pkt stack.PacketBufferPtr, igmpType header ) } -func validateIgmpv3ReportPacket(t *testing.T, pkt stack.PacketBufferPtr, srcAddr, groupAddress tcpip.Address) { +func validateIgmpv3ReportPacket(t *testing.T, pkt *stack.PacketBuffer, srcAddr, groupAddress tcpip.Address) { t.Helper() payload := stack.PayloadSince(pkt.NetworkHeader()) diff --git a/pkg/tcpip/network/ipv4/ipv4.go b/pkg/tcpip/network/ipv4/ipv4.go index 4c59fe158..d8fff5368 100644 --- a/pkg/tcpip/network/ipv4/ipv4.go +++ b/pkg/tcpip/network/ipv4/ipv4.go @@ -137,7 +137,7 @@ func (e *endpoint) getIGMPVersionLocked() IGMPVersion { } // HandleLinkResolutionFailure implements stack.LinkResolvableNetworkEndpoint. -func (e *endpoint) HandleLinkResolutionFailure(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandleLinkResolutionFailure(pkt *stack.PacketBuffer) { // If we are operating as a router, return an ICMP error to the original // packet's sender. if pkt.NetworkPacketInfo.IsForwardedPacket { @@ -448,7 +448,7 @@ func (e *endpoint) getID() uint16 { return id } -func (e *endpoint) addIPHeader(srcAddr, dstAddr tcpip.Address, pkt stack.PacketBufferPtr, params stack.NetworkHeaderParams, options header.IPv4OptionsSerializer) tcpip.Error { +func (e *endpoint) addIPHeader(srcAddr, dstAddr tcpip.Address, pkt *stack.PacketBuffer, params stack.NetworkHeaderParams, options header.IPv4OptionsSerializer) tcpip.Error { hdrLen := header.IPv4MinimumSize var optLen int if options != nil { @@ -485,7 +485,7 @@ func (e *endpoint) addIPHeader(srcAddr, dstAddr tcpip.Address, pkt stack.PacketB // fragment. It returns the number of fragments handled and the number of // fragments left to be processed. The IP header must already be present in the // original packet. -func (e *endpoint) handleFragments(_ *stack.Route, networkMTU uint32, pkt stack.PacketBufferPtr, handler func(stack.PacketBufferPtr) tcpip.Error) (int, int, tcpip.Error) { +func (e *endpoint) handleFragments(_ *stack.Route, networkMTU uint32, pkt *stack.PacketBuffer, handler func(*stack.PacketBuffer) tcpip.Error) (int, int, tcpip.Error) { // Round the MTU down to align to 8 bytes. fragmentPayloadSize := networkMTU &^ 7 networkHeader := header.IPv4(pkt.NetworkHeader().Slice()) @@ -508,7 +508,7 @@ func (e *endpoint) handleFragments(_ *stack.Route, networkMTU uint32, pkt stack. } // WritePacket writes a packet to the given destination address and protocol. -func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt *stack.PacketBuffer) tcpip.Error { if err := e.addIPHeader(r.LocalAddress(), r.RemoteAddress(), pkt, params, nil /* options */); err != nil { return err } @@ -516,7 +516,7 @@ func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, return e.writePacket(r, pkt) } -func (e *endpoint) writePacket(r *stack.Route, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) writePacket(r *stack.Route, pkt *stack.PacketBuffer) tcpip.Error { netHeader := header.IPv4(pkt.NetworkHeader().Slice()) dstAddr := netHeader.DestinationAddress() @@ -548,7 +548,7 @@ func (e *endpoint) writePacket(r *stack.Route, pkt stack.PacketBufferPtr) tcpip. return e.writePacketPostRouting(r, pkt, false /* headerIncluded */) } -func (e *endpoint) writePacketPostRouting(r *stack.Route, pkt stack.PacketBufferPtr, headerIncluded bool) tcpip.Error { +func (e *endpoint) writePacketPostRouting(r *stack.Route, pkt *stack.PacketBuffer, headerIncluded bool) tcpip.Error { if r.Loop()&stack.PacketLoop != 0 { // If the packet was generated by the stack (not a raw/packet endpoint // where a packet may be written with the header included), then we can @@ -583,7 +583,7 @@ func (e *endpoint) writePacketPostRouting(r *stack.Route, pkt stack.PacketBuffer // is set but the packet must be fragmented for the non-forwarding case. return &tcpip.ErrMessageTooLong{} } - sent, remain, err := e.handleFragments(r, networkMTU, pkt, func(fragPkt stack.PacketBufferPtr) tcpip.Error { + sent, remain, err := e.handleFragments(r, networkMTU, pkt, func(fragPkt *stack.PacketBuffer) tcpip.Error { // TODO(gvisor.dev/issue/3884): Evaluate whether we want to send each // fragment one by one using WritePacket() (current strategy) or if we // want to create a PacketBufferList from the fragments and feed it to @@ -604,7 +604,7 @@ func (e *endpoint) writePacketPostRouting(r *stack.Route, pkt stack.PacketBuffer } // WriteHeaderIncludedPacket implements stack.NetworkEndpoint. -func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt *stack.PacketBuffer) tcpip.Error { // The packet already has an IP header, but there are a few required // checks. h, ok := pkt.Data().PullUp(header.IPv4MinimumSize) @@ -666,7 +666,7 @@ func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt stack.PacketBuf // updating the options. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt stack.PacketBufferPtr, updateOptions bool) ip.ForwardingError { +func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt *stack.PacketBuffer, updateOptions bool) ip.ForwardingError { h := header.IPv4(pkt.NetworkHeader().Slice()) stk := e.protocol.stack @@ -736,7 +736,7 @@ func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt stack.PacketBu } // forwardUnicastPacket attempts to forward a packet to its final destination. -func (e *endpoint) forwardUnicastPacket(pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) forwardUnicastPacket(pkt *stack.PacketBuffer) ip.ForwardingError { hView := pkt.NetworkHeader().View() defer hView.Release() h := header.IPv4(hView.AsSlice()) @@ -814,7 +814,7 @@ func (e *endpoint) forwardUnicastPacket(pkt stack.PacketBufferPtr) ip.Forwarding // HandlePacket is called by the link layer when new ipv4 packets arrive for // this endpoint. -func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(pkt *stack.PacketBuffer) { stats := e.stats.ip stats.PacketsReceived.Increment() @@ -873,7 +873,7 @@ func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { // handleLocalPacket is like HandlePacket except it does not perform the // prerouting iptables hook or check for loopback traffic that originated from // outside of the netstack (i.e. martian loopback packets). -func (e *endpoint) handleLocalPacket(pkt stack.PacketBufferPtr, canSkipRXChecksum bool) { +func (e *endpoint) handleLocalPacket(pkt *stack.PacketBuffer, canSkipRXChecksum bool) { stats := e.stats.ip stats.PacketsReceived.Increment() @@ -945,7 +945,7 @@ func validateAddressesForForwarding(h header.IPv4) ip.ForwardingError { // // This method should be invoked for incoming multicast packets using the // endpoint that received the packet. -func (e *endpoint) forwardMulticastPacket(h header.IPv4, pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) forwardMulticastPacket(h header.IPv4, pkt *stack.PacketBuffer) ip.ForwardingError { if err := validateAddressesForForwarding(h); err != nil { return err } @@ -998,7 +998,7 @@ func (e *endpoint) forwardMulticastPacket(h header.IPv4, pkt stack.PacketBufferP return &ip.ErrHostUnreachable{} } -func (e *endpoint) updateOptionsForForwarding(pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) updateOptionsForForwarding(pkt *stack.PacketBuffer) ip.ForwardingError { h := header.IPv4(pkt.NetworkHeader().Slice()) if opts := h.Options(); len(opts) != 0 { newOpts, _, optProblem := e.processIPOptions(pkt, opts, &optionUsageForward{}) @@ -1033,7 +1033,7 @@ func (e *endpoint) updateOptionsForForwarding(pkt stack.PacketBufferPtr) ip.Forw // provided installedRoute. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardValidatedMulticastPacket(pkt stack.PacketBufferPtr, installedRoute *multicast.InstalledRoute) ip.ForwardingError { +func (e *endpoint) forwardValidatedMulticastPacket(pkt *stack.PacketBuffer, installedRoute *multicast.InstalledRoute) ip.ForwardingError { // Per RFC 1812 section 5.2.1.3, // // Based on the IP source and destination addresses found in the datagram @@ -1066,7 +1066,7 @@ func (e *endpoint) forwardValidatedMulticastPacket(pkt stack.PacketBufferPtr, in // of the provided outgoingInterface. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardMulticastPacketForOutgoingInterface(pkt stack.PacketBufferPtr, outgoingInterface stack.MulticastRouteOutgoingInterface) ip.ForwardingError { +func (e *endpoint) forwardMulticastPacketForOutgoingInterface(pkt *stack.PacketBuffer, outgoingInterface stack.MulticastRouteOutgoingInterface) ip.ForwardingError { h := header.IPv4(pkt.NetworkHeader().Slice()) // Per RFC 1812 section 5.2.1.3, @@ -1093,7 +1093,7 @@ func (e *endpoint) forwardMulticastPacketForOutgoingInterface(pkt stack.PacketBu return e.forwardPacketWithRoute(route, pkt, true /* updateOptions */) } -func (e *endpoint) handleValidatedPacket(h header.IPv4, pkt stack.PacketBufferPtr, inNICName string) { +func (e *endpoint) handleValidatedPacket(h header.IPv4, pkt *stack.PacketBuffer, inNICName string) { pkt.NICID = e.nic.ID() // Raw socket packets are delivered based solely on the transport protocol @@ -1204,7 +1204,7 @@ func (e *endpoint) handleForwardingError(err ip.ForwardingError) { stats.Forwarding.Errors.Increment() } -func (e *endpoint) deliverPacketLocally(h header.IPv4, pkt stack.PacketBufferPtr, inNICName string) { +func (e *endpoint) deliverPacketLocally(h header.IPv4, pkt *stack.PacketBuffer, inNICName string) { stats := e.stats // iptables filtering. All packets that reach here are intended for // this machine and will not be forwarded. @@ -1716,7 +1716,7 @@ func (p *protocol) MulticastRouteLastUsedTime(addresses stack.UnicastSourceAndMu return timestamp, nil } -func (p *protocol) forwardPendingMulticastPacket(pkt stack.PacketBufferPtr, installedRoute *multicast.InstalledRoute) { +func (p *protocol) forwardPendingMulticastPacket(pkt *stack.PacketBuffer, installedRoute *multicast.InstalledRoute) { defer pkt.DecRef() // Attempt to forward the packet using the endpoint that it originally @@ -1773,7 +1773,7 @@ func (p *protocol) isSubnetLocalBroadcastAddress(addr tcpip.Address) bool { // returns the parsed IP header. // // Returns true if the IP header was successfully parsed. -func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*buffer.View, bool) { +func (p *protocol) parseAndValidate(pkt *stack.PacketBuffer) (*buffer.View, bool) { transProtoNum, hasTransportHdr, ok := p.Parse(pkt) if !ok { return nil, false @@ -1797,7 +1797,7 @@ func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*buffer.View, bo return pkt.NetworkHeader().View(), true } -func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip.TransportProtocolNumber) { +func (p *protocol) parseTransport(pkt *stack.PacketBuffer, transProtoNum tcpip.TransportProtocolNumber) { if transProtoNum == header.ICMPv4ProtocolNumber { // The transport layer will handle transport layer parsing errors. _ = parse.ICMPv4(pkt) @@ -1815,7 +1815,7 @@ func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip } // Parse implements stack.NetworkProtocol. -func (*protocol) Parse(pkt stack.PacketBufferPtr) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { +func (*protocol) Parse(pkt *stack.PacketBuffer) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { if ok := parse.IPv4(pkt); !ok { return 0, false, false } @@ -1842,7 +1842,7 @@ func (p *protocol) allowICMPReply(icmpType header.ICMPv4Type, code header.ICMPv4 } // SendRejectionError implements stack.RejectIPv4WithHandler. -func (p *protocol) SendRejectionError(pkt stack.PacketBufferPtr, rejectWith stack.RejectIPv4WithICMPType, inputHook bool) tcpip.Error { +func (p *protocol) SendRejectionError(pkt *stack.PacketBuffer, rejectWith stack.RejectIPv4WithICMPType, inputHook bool) tcpip.Error { switch rejectWith { case stack.RejectIPv4WithICMPNetUnreachable: return p.returnError(&icmpReasonNetworkUnreachable{}, pkt, inputHook) @@ -1884,7 +1884,7 @@ func calculateNetworkMTU(linkMTU, networkHeaderSize uint32) (uint32, tcpip.Error return networkMTU - networkHeaderSize, nil } -func packetMustBeFragmented(pkt stack.PacketBufferPtr, networkMTU uint32) bool { +func packetMustBeFragmented(pkt *stack.PacketBuffer, networkMTU uint32) bool { payload := len(pkt.TransportHeader().Slice()) + pkt.Data().Size() return pkt.GSOOptions.Type == stack.GSONone && uint32(payload) > networkMTU } @@ -1961,7 +1961,7 @@ func NewProtocol(s *stack.Stack) stack.NetworkProtocol { return NewProtocolWithOptions(Options{})(s) } -func buildNextFragment(pf *fragmentation.PacketFragmenter, originalIPHeader header.IPv4) (stack.PacketBufferPtr, bool) { +func buildNextFragment(pf *fragmentation.PacketFragmenter, originalIPHeader header.IPv4) (*stack.PacketBuffer, bool) { fragPkt, offset, copied, more := pf.BuildNextFragment() fragPkt.NetworkProtocolNumber = ProtocolNumber @@ -2302,7 +2302,7 @@ type optionTracker struct { // // If there were no errors during parsing, the new set of options is returned as // a new buffer. -func (e *endpoint) processIPOptions(pkt stack.PacketBufferPtr, opts header.IPv4Options, usage optionsUsage) (header.IPv4Options, optionTracker, *header.IPv4OptParameterProblem) { +func (e *endpoint) processIPOptions(pkt *stack.PacketBuffer, opts header.IPv4Options, usage optionsUsage) (header.IPv4Options, optionTracker, *header.IPv4OptParameterProblem) { stats := e.stats.ip optIter := opts.MakeIterator() diff --git a/pkg/tcpip/network/ipv4/ipv4_test.go b/pkg/tcpip/network/ipv4/ipv4_test.go index 4f5efb048..4f3e4a257 100644 --- a/pkg/tcpip/network/ipv4/ipv4_test.go +++ b/pkg/tcpip/network/ipv4/ipv4_test.go @@ -249,7 +249,7 @@ type packetOptions struct { options header.IPv4Options } -func newICMPEchoPacket(t *testing.T, srcAddr, dstAddr tcpip.Address, ttl uint8, options packetOptions) (stack.PacketBufferPtr, []byte) { +func newICMPEchoPacket(t *testing.T, srcAddr, dstAddr tcpip.Address, ttl uint8, options packetOptions) (*stack.PacketBuffer, []byte) { const ( arbitraryICMPHeaderSequence = 123 randomIdent = 42 @@ -314,9 +314,9 @@ func max(a, b int) int { return b } -func checkFragements(t *testing.T, ep *channel.Endpoint, expectedFragments []fragmentInfo, requestPkt stack.PacketBufferPtr) { +func checkFragements(t *testing.T, ep *channel.Endpoint, expectedFragments []fragmentInfo, requestPkt *stack.PacketBuffer) { t.Helper() - var fragmentedPackets []stack.PacketBufferPtr + var fragmentedPackets []*stack.PacketBuffer for i := 0; i < len(expectedFragments); i++ { reply := ep.Read() if reply.IsNil() { @@ -1958,7 +1958,7 @@ func TestIPv4Sanity(t *testing.T) { // If withIPHeader is set to true, we will validate the fragmented packets' IP // headers against the source packet's IP header. If set to false, we validate // the fragmented packets' IP headers against each other. -func compareFragments(packets []stack.PacketBufferPtr, sourcePacket stack.PacketBufferPtr, mtu uint32, wantFragments []fragmentInfo, proto tcpip.TransportProtocolNumber, withIPHeader bool, expectedAvailableHeaderBytes int) error { +func compareFragments(packets []*stack.PacketBuffer, sourcePacket *stack.PacketBuffer, mtu uint32, wantFragments []fragmentInfo, proto tcpip.TransportProtocolNumber, withIPHeader bool, expectedAvailableHeaderBytes int) error { // Make a complete array of the sourcePacket packet. var source header.IPv4 buf := sourcePacket.ToBuffer() @@ -3539,7 +3539,7 @@ func (*limitedMatcher) Name() string { } // Match implements Matcher.Match. -func (lm *limitedMatcher) Match(stack.Hook, stack.PacketBufferPtr, string, string) (bool, bool) { +func (lm *limitedMatcher) Match(stack.Hook, *stack.PacketBuffer, string, string) (bool, bool) { if lm.limit == 0 { return true, false } diff --git a/pkg/tcpip/network/ipv6/icmp.go b/pkg/tcpip/network/ipv6/icmp.go index c8fb2df86..661507b31 100644 --- a/pkg/tcpip/network/ipv6/icmp.go +++ b/pkg/tcpip/network/ipv6/icmp.go @@ -164,7 +164,7 @@ func (e *endpoint) checkLocalAddress(addr tcpip.Address) bool { // the original packet that caused the ICMP one to be sent. This information is // used to find out which transport endpoint must be notified about the ICMP // packet. -func (e *endpoint) handleControl(transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) handleControl(transErr stack.TransportError, pkt *stack.PacketBuffer) { h, ok := pkt.Data().PullUp(header.IPv6MinimumSize) if !ok { return @@ -267,7 +267,7 @@ func getTargetLinkAddr(it header.NDPOptionIterator) (tcpip.LinkAddress, bool) { }) } -func isMLDValid(pkt stack.PacketBufferPtr, iph header.IPv6, routerAlert *header.IPv6RouterAlertOption) bool { +func isMLDValid(pkt *stack.PacketBuffer, iph header.IPv6, routerAlert *header.IPv6RouterAlertOption) bool { // As per RFC 2710 section 3: // All MLD messages described in this document are sent with a link-local // IPv6 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert @@ -287,7 +287,7 @@ func isMLDValid(pkt stack.PacketBufferPtr, iph header.IPv6, routerAlert *header. return true } -func (e *endpoint) handleICMP(pkt stack.PacketBufferPtr, hasFragmentHeader bool, routerAlert *header.IPv6RouterAlertOption) { +func (e *endpoint) handleICMP(pkt *stack.PacketBuffer, hasFragmentHeader bool, routerAlert *header.IPv6RouterAlertOption) { sent := e.stats.icmp.packetsSent received := e.stats.icmp.packetsReceived h := header.ICMPv6(pkt.TransportHeader().Slice()) @@ -1053,7 +1053,7 @@ func (*icmpReasonReassemblyTimeout) respondsToMulticast() bool { // returnError takes an error descriptor and generates the appropriate ICMP // error packet for IPv6 and sends it. -func (p *protocol) returnError(reason icmpReason, pkt stack.PacketBufferPtr, deliveredLocally bool) tcpip.Error { +func (p *protocol) returnError(reason icmpReason, pkt *stack.PacketBuffer, deliveredLocally bool) tcpip.Error { origIPHdr := header.IPv6(pkt.NetworkHeader().Slice()) origIPHdrSrc := origIPHdr.SourceAddress() origIPHdrDst := origIPHdr.DestinationAddress() @@ -1218,7 +1218,7 @@ func (p *protocol) returnError(reason icmpReason, pkt stack.PacketBufferPtr, del } // OnReassemblyTimeout implements fragmentation.TimeoutHandler. -func (p *protocol) OnReassemblyTimeout(pkt stack.PacketBufferPtr) { +func (p *protocol) OnReassemblyTimeout(pkt *stack.PacketBuffer) { // OnReassemblyTimeout sends a Time Exceeded Message as per RFC 2460 Section // 4.5: // diff --git a/pkg/tcpip/network/ipv6/icmp_test.go b/pkg/tcpip/network/ipv6/icmp_test.go index 31ffbe0fe..b6bf1354c 100644 --- a/pkg/tcpip/network/ipv6/icmp_test.go +++ b/pkg/tcpip/network/ipv6/icmp_test.go @@ -86,7 +86,7 @@ func (*stubLinkEndpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.E func (*stubLinkEndpoint) Attach(stack.NetworkDispatcher) {} -func (*stubLinkEndpoint) AddHeader(stack.PacketBufferPtr) {} +func (*stubLinkEndpoint) AddHeader(*stack.PacketBuffer) {} func (*stubLinkEndpoint) Wait() {} @@ -94,11 +94,11 @@ type stubDispatcher struct { stack.TransportDispatcher } -func (*stubDispatcher) DeliverTransportPacket(tcpip.TransportProtocolNumber, stack.PacketBufferPtr) stack.TransportPacketDisposition { +func (*stubDispatcher) DeliverTransportPacket(tcpip.TransportProtocolNumber, *stack.PacketBuffer) stack.TransportPacketDisposition { return stack.TransportPacketHandled } -func (*stubDispatcher) DeliverRawPacket(tcpip.TransportProtocolNumber, stack.PacketBufferPtr) { +func (*stubDispatcher) DeliverRawPacket(tcpip.TransportProtocolNumber, *stack.PacketBuffer) { // No-op. } @@ -137,7 +137,7 @@ func (*testInterface) Spoofing() bool { return false } -func (t *testInterface) WritePacket(r *stack.Route, pkt stack.PacketBufferPtr) tcpip.Error { +func (t *testInterface) WritePacket(r *stack.Route, pkt *stack.PacketBuffer) tcpip.Error { pkt.EgressRoute = r.Fields() var pkts stack.PacketBufferList pkts.PushBack(pkt) @@ -145,7 +145,7 @@ func (t *testInterface) WritePacket(r *stack.Route, pkt stack.PacketBufferPtr) t return err } -func (t *testInterface) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, pkt stack.PacketBufferPtr) tcpip.Error { +func (t *testInterface) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, pkt *stack.PacketBuffer) tcpip.Error { pkt.EgressRoute.NetProto = pkt.NetworkProtocolNumber pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr var pkts stack.PacketBufferList diff --git a/pkg/tcpip/network/ipv6/ipv6.go b/pkg/tcpip/network/ipv6/ipv6.go index c7e546e97..b0da8b4b5 100644 --- a/pkg/tcpip/network/ipv6/ipv6.go +++ b/pkg/tcpip/network/ipv6/ipv6.go @@ -283,7 +283,7 @@ func (*endpoint) DuplicateAddressProtocol() tcpip.NetworkProtocolNumber { } // HandleLinkResolutionFailure implements stack.LinkResolvableNetworkEndpoint. -func (e *endpoint) HandleLinkResolutionFailure(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandleLinkResolutionFailure(pkt *stack.PacketBuffer) { // If we are operating as a router, we should return an ICMP error to the // original packet's sender. if pkt.NetworkPacketInfo.IsForwardedPacket { @@ -721,7 +721,7 @@ func (e *endpoint) MaxHeaderLength() uint16 { return e.nic.MaxHeaderLength() + header.IPv6MinimumSize } -func addIPHeader(srcAddr, dstAddr tcpip.Address, pkt stack.PacketBufferPtr, params stack.NetworkHeaderParams, extensionHeaders header.IPv6ExtHdrSerializer) tcpip.Error { +func addIPHeader(srcAddr, dstAddr tcpip.Address, pkt *stack.PacketBuffer, params stack.NetworkHeaderParams, extensionHeaders header.IPv6ExtHdrSerializer) tcpip.Error { extHdrsLen := extensionHeaders.Length() length := pkt.Size() + extensionHeaders.Length() if length > math.MaxUint16 { @@ -740,7 +740,7 @@ func addIPHeader(srcAddr, dstAddr tcpip.Address, pkt stack.PacketBufferPtr, para return nil } -func packetMustBeFragmented(pkt stack.PacketBufferPtr, networkMTU uint32) bool { +func packetMustBeFragmented(pkt *stack.PacketBuffer, networkMTU uint32) bool { payload := len(pkt.TransportHeader().Slice()) + pkt.Data().Size() return pkt.GSOOptions.Type == stack.GSONone && uint32(payload) > networkMTU } @@ -750,7 +750,7 @@ func packetMustBeFragmented(pkt stack.PacketBufferPtr, networkMTU uint32) bool { // fragments left to be processed. The IP header must already be present in the // original packet. The transport header protocol number is required to avoid // parsing the IPv6 extension headers. -func (e *endpoint) handleFragments(r *stack.Route, networkMTU uint32, pkt stack.PacketBufferPtr, transProto tcpip.TransportProtocolNumber, handler func(stack.PacketBufferPtr) tcpip.Error) (int, int, tcpip.Error) { +func (e *endpoint) handleFragments(r *stack.Route, networkMTU uint32, pkt *stack.PacketBuffer, transProto tcpip.TransportProtocolNumber, handler func(*stack.PacketBuffer) tcpip.Error) (int, int, tcpip.Error) { networkHeader := header.IPv6(pkt.NetworkHeader().Slice()) // TODO(gvisor.dev/issue/3912): Once the Authentication or ESP Headers are @@ -792,7 +792,7 @@ func (e *endpoint) handleFragments(r *stack.Route, networkMTU uint32, pkt stack. } // WritePacket writes a packet to the given destination address and protocol. -func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt *stack.PacketBuffer) tcpip.Error { dstAddr := r.RemoteAddress() if err := addIPHeader(r.LocalAddress(), dstAddr, pkt, params, nil /* extensionHeaders */); err != nil { return err @@ -826,7 +826,7 @@ func (e *endpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, return e.writePacket(r, pkt, params.Protocol, false /* headerIncluded */) } -func (e *endpoint) writePacket(r *stack.Route, pkt stack.PacketBufferPtr, protocol tcpip.TransportProtocolNumber, headerIncluded bool) tcpip.Error { +func (e *endpoint) writePacket(r *stack.Route, pkt *stack.PacketBuffer, protocol tcpip.TransportProtocolNumber, headerIncluded bool) tcpip.Error { if r.Loop()&stack.PacketLoop != 0 { // If the packet was generated by the stack (not a raw/packet endpoint // where a packet may be written with the header included), then we can @@ -860,7 +860,7 @@ func (e *endpoint) writePacket(r *stack.Route, pkt stack.PacketBufferPtr, protoc // not by routers along a packet's delivery path. return &tcpip.ErrMessageTooLong{} } - sent, remain, err := e.handleFragments(r, networkMTU, pkt, protocol, func(fragPkt stack.PacketBufferPtr) tcpip.Error { + sent, remain, err := e.handleFragments(r, networkMTU, pkt, protocol, func(fragPkt *stack.PacketBuffer) tcpip.Error { // TODO(gvisor.dev/issue/3884): Evaluate whether we want to send each // fragment one by one using WritePacket() (current strategy) or if we // want to create a PacketBufferList from the fragments and feed it to @@ -882,7 +882,7 @@ func (e *endpoint) writePacket(r *stack.Route, pkt stack.PacketBufferPtr, protoc } // WriteHeaderIncludedPacket implements stack.NetworkEndpoint. -func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt stack.PacketBufferPtr) tcpip.Error { +func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt *stack.PacketBuffer) tcpip.Error { // The packet already has an IP header, but there are a few required checks. h, ok := pkt.Data().PullUp(header.IPv6MinimumSize) if !ok { @@ -948,7 +948,7 @@ func validateAddressesForForwarding(h header.IPv6) ip.ForwardingError { // forwardUnicastPacket attempts to forward a unicast packet to its final // destination. -func (e *endpoint) forwardUnicastPacket(pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) forwardUnicastPacket(pkt *stack.PacketBuffer) ip.ForwardingError { h := header.IPv6(pkt.NetworkHeader().Slice()) if err := validateAddressesForForwarding(h); err != nil { @@ -1017,7 +1017,7 @@ func (e *endpoint) forwardUnicastPacket(pkt stack.PacketBufferPtr) ip.Forwarding // forwardPacketWithRoute emits the pkt using the provided route. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt *stack.PacketBuffer) ip.ForwardingError { h := header.IPv6(pkt.NetworkHeader().Slice()) stk := e.protocol.stack @@ -1069,7 +1069,7 @@ func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt stack.PacketBu // HandlePacket is called by the link layer when new ipv6 packets arrive for // this endpoint. -func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(pkt *stack.PacketBuffer) { stats := e.stats.ip stats.PacketsReceived.Increment() @@ -1132,7 +1132,7 @@ func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { // handleLocalPacket is like HandlePacket except it does not perform the // prerouting iptables hook or check for loopback traffic that originated from // outside of the netstack (i.e. martian loopback packets). -func (e *endpoint) handleLocalPacket(pkt stack.PacketBufferPtr, canSkipRXChecksum bool) { +func (e *endpoint) handleLocalPacket(pkt *stack.PacketBuffer, canSkipRXChecksum bool) { stats := e.stats.ip stats.PacketsReceived.Increment() @@ -1159,7 +1159,7 @@ func (e *endpoint) handleLocalPacket(pkt stack.PacketBufferPtr, canSkipRXChecksu // // This method should be invoked for incoming multicast packets using the // endpoint that received the packet. -func (e *endpoint) forwardMulticastPacket(h header.IPv6, pkt stack.PacketBufferPtr) ip.ForwardingError { +func (e *endpoint) forwardMulticastPacket(h header.IPv6, pkt *stack.PacketBuffer) ip.ForwardingError { if err := validateAddressesForForwarding(h); err != nil { return err } @@ -1205,7 +1205,7 @@ func (e *endpoint) forwardMulticastPacket(h header.IPv6, pkt stack.PacketBufferP // provided installedRoute. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardValidatedMulticastPacket(pkt stack.PacketBufferPtr, installedRoute *multicast.InstalledRoute) ip.ForwardingError { +func (e *endpoint) forwardValidatedMulticastPacket(pkt *stack.PacketBuffer, installedRoute *multicast.InstalledRoute) ip.ForwardingError { // Per RFC 1812 section 5.2.1.3, // // Based on the IP source and destination addresses found in the datagram @@ -1238,7 +1238,7 @@ func (e *endpoint) forwardValidatedMulticastPacket(pkt stack.PacketBufferPtr, in // of the provided outgoing interface. // // This method should be invoked by the endpoint that received the pkt. -func (e *endpoint) forwardMulticastPacketForOutgoingInterface(pkt stack.PacketBufferPtr, outgoingInterface stack.MulticastRouteOutgoingInterface) ip.ForwardingError { +func (e *endpoint) forwardMulticastPacketForOutgoingInterface(pkt *stack.PacketBuffer, outgoingInterface stack.MulticastRouteOutgoingInterface) ip.ForwardingError { h := header.IPv6(pkt.NetworkHeader().Slice()) // Per RFC 1812 section 5.2.1.3, @@ -1299,7 +1299,7 @@ func (e *endpoint) handleForwardingError(err ip.ForwardingError) { stats.Forwarding.Errors.Increment() } -func (e *endpoint) handleValidatedPacket(h header.IPv6, pkt stack.PacketBufferPtr, inNICName string) { +func (e *endpoint) handleValidatedPacket(h header.IPv6, pkt *stack.PacketBuffer, inNICName string) { pkt.NICID = e.nic.ID() // Raw socket packets are delivered based solely on the transport protocol @@ -1358,7 +1358,7 @@ func (e *endpoint) handleValidatedPacket(h header.IPv6, pkt stack.PacketBufferPt } } -func (e *endpoint) deliverPacketLocally(h header.IPv6, pkt stack.PacketBufferPtr, inNICName string) { +func (e *endpoint) deliverPacketLocally(h header.IPv6, pkt *stack.PacketBuffer, inNICName string) { stats := e.stats.ip // iptables filtering. All packets that reach here are intended for @@ -1374,7 +1374,7 @@ func (e *endpoint) deliverPacketLocally(h header.IPv6, pkt stack.PacketBufferPtr _ = e.processExtensionHeaders(h, pkt, false /* forwarding */) } -func (e *endpoint) processExtensionHeader(it *header.IPv6PayloadIterator, pkt *stack.PacketBufferPtr, h header.IPv6, routerAlert **header.IPv6RouterAlertOption, hasFragmentHeader *bool, forwarding bool) (bool, error) { +func (e *endpoint) processExtensionHeader(it *header.IPv6PayloadIterator, pkt **stack.PacketBuffer, h header.IPv6, routerAlert **header.IPv6RouterAlertOption, hasFragmentHeader *bool, forwarding bool) (bool, error) { stats := e.stats.ip dstAddr := h.DestinationAddress() // Keep track of the start of the previous header so we can report the @@ -1452,7 +1452,7 @@ func (e *endpoint) processExtensionHeader(it *header.IPv6PayloadIterator, pkt *s // processExtensionHeaders processes the extension headers in the given packet. // Returns an error if the processing of a header failed or if the packet should // be discarded. -func (e *endpoint) processExtensionHeaders(h header.IPv6, pkt stack.PacketBufferPtr, forwarding bool) error { +func (e *endpoint) processExtensionHeaders(h header.IPv6, pkt *stack.PacketBuffer, forwarding bool) error { // Create a VV to parse the packet. We don't plan to modify anything here. // vv consists of: // - Any IPv6 header bytes after the first 40 (i.e. extensions). @@ -1488,7 +1488,7 @@ func (e *endpoint) processExtensionHeaders(h header.IPv6, pkt stack.PacketBuffer } } -func (e *endpoint) processIPv6RawPayloadHeader(extHdr *header.IPv6RawPayloadHeader, it *header.IPv6PayloadIterator, pkt stack.PacketBufferPtr, routerAlert *header.IPv6RouterAlertOption, previousHeaderStart uint32, hasFragmentHeader bool) error { +func (e *endpoint) processIPv6RawPayloadHeader(extHdr *header.IPv6RawPayloadHeader, it *header.IPv6PayloadIterator, pkt *stack.PacketBuffer, routerAlert *header.IPv6RouterAlertOption, previousHeaderStart uint32, hasFragmentHeader bool) error { stats := e.stats.ip // If the last header in the payload isn't a known IPv6 extension header, // handle it as if it is transport layer data.Ã¥ @@ -1570,7 +1570,7 @@ func (e *endpoint) processIPv6RawPayloadHeader(extHdr *header.IPv6RawPayloadHead } } -func (e *endpoint) processIPv6RoutingExtHeader(extHdr *header.IPv6RoutingExtHdr, it *header.IPv6PayloadIterator, pkt stack.PacketBufferPtr) error { +func (e *endpoint) processIPv6RoutingExtHeader(extHdr *header.IPv6RoutingExtHdr, it *header.IPv6PayloadIterator, pkt *stack.PacketBuffer) error { // As per RFC 8200 section 4.4, if a node encounters a routing header with // an unrecognized routing type value, with a non-zero Segments Left // value, the node must discard the packet and send an ICMP Parameter @@ -1593,7 +1593,7 @@ func (e *endpoint) processIPv6RoutingExtHeader(extHdr *header.IPv6RoutingExtHdr, return fmt.Errorf("found unrecognized routing type with non-zero segments left in header = %#v", extHdr) } -func (e *endpoint) processIPv6DestinationOptionsExtHdr(extHdr *header.IPv6DestinationOptionsExtHdr, it *header.IPv6PayloadIterator, pkt stack.PacketBufferPtr, dstAddr tcpip.Address) error { +func (e *endpoint) processIPv6DestinationOptionsExtHdr(extHdr *header.IPv6DestinationOptionsExtHdr, it *header.IPv6PayloadIterator, pkt *stack.PacketBuffer, dstAddr tcpip.Address) error { stats := e.stats.ip optsIt := extHdr.Iter() var uopt *header.IPv6UnknownExtHdrOption @@ -1656,7 +1656,7 @@ func (e *endpoint) processIPv6DestinationOptionsExtHdr(extHdr *header.IPv6Destin return nil } -func (e *endpoint) processIPv6HopByHopOptionsExtHdr(extHdr *header.IPv6HopByHopOptionsExtHdr, it *header.IPv6PayloadIterator, pkt stack.PacketBufferPtr, dstAddr tcpip.Address, routerAlert **header.IPv6RouterAlertOption, previousHeaderStart uint32, forwarding bool) error { +func (e *endpoint) processIPv6HopByHopOptionsExtHdr(extHdr *header.IPv6HopByHopOptionsExtHdr, it *header.IPv6PayloadIterator, pkt *stack.PacketBuffer, dstAddr tcpip.Address, routerAlert **header.IPv6RouterAlertOption, previousHeaderStart uint32, forwarding bool) error { stats := e.stats.ip // As per RFC 8200 section 4.1, the Hop By Hop extension header is // restricted to appear immediately after an IPv6 fixed header. @@ -1738,7 +1738,7 @@ func (e *endpoint) processIPv6HopByHopOptionsExtHdr(extHdr *header.IPv6HopByHopO return nil } -func (e *endpoint) processFragmentExtHdr(extHdr *header.IPv6FragmentExtHdr, it *header.IPv6PayloadIterator, pkt *stack.PacketBufferPtr, h header.IPv6) error { +func (e *endpoint) processFragmentExtHdr(extHdr *header.IPv6FragmentExtHdr, it *header.IPv6PayloadIterator, pkt **stack.PacketBuffer, h header.IPv6) error { stats := e.stats.ip fragmentFieldOffset := it.ParseOffset() @@ -2558,7 +2558,7 @@ func (p *protocol) DisableMulticastForwarding() { p.multicastRouteTable.RemoveAllInstalledRoutes() } -func (p *protocol) forwardPendingMulticastPacket(pkt stack.PacketBufferPtr, installedRoute *multicast.InstalledRoute) { +func (p *protocol) forwardPendingMulticastPacket(pkt *stack.PacketBuffer, installedRoute *multicast.InstalledRoute) { defer pkt.DecRef() // Attempt to forward the packet using the endpoint that it originally @@ -2588,7 +2588,7 @@ func (*protocol) Wait() {} // for releasing the returned View. // // Returns true if the IP header was successfully parsed. -func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*buffer.View, bool) { +func (p *protocol) parseAndValidate(pkt *stack.PacketBuffer) (*buffer.View, bool) { transProtoNum, hasTransportHdr, ok := p.Parse(pkt) if !ok { return nil, false @@ -2608,7 +2608,7 @@ func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*buffer.View, bo return pkt.NetworkHeader().View(), true } -func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip.TransportProtocolNumber) { +func (p *protocol) parseTransport(pkt *stack.PacketBuffer, transProtoNum tcpip.TransportProtocolNumber) { if transProtoNum == header.ICMPv6ProtocolNumber { // The transport layer will handle transport layer parsing errors. _ = parse.ICMPv6(pkt) @@ -2626,7 +2626,7 @@ func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip } // Parse implements stack.NetworkProtocol. -func (*protocol) Parse(pkt stack.PacketBufferPtr) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { +func (*protocol) Parse(pkt *stack.PacketBuffer) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) { proto, _, fragOffset, fragMore, ok := parse.IPv6(pkt) if !ok { return 0, false, false @@ -2648,7 +2648,7 @@ func (p *protocol) allowICMPReply(icmpType header.ICMPv6Type) bool { } // SendRejectionError implements stack.RejectIPv6WithHandler. -func (p *protocol) SendRejectionError(pkt stack.PacketBufferPtr, rejectWith stack.RejectIPv6WithICMPType, inputHook bool) tcpip.Error { +func (p *protocol) SendRejectionError(pkt *stack.PacketBuffer, rejectWith stack.RejectIPv6WithICMPType, inputHook bool) tcpip.Error { switch rejectWith { case stack.RejectIPv6WithICMPNoRoute: return p.returnError(&icmpReasonNetUnreachable{}, pkt, inputHook) @@ -2781,7 +2781,7 @@ func NewProtocol(s *stack.Stack) stack.NetworkProtocol { return NewProtocolWithOptions(Options{})(s) } -func calculateFragmentReserve(pkt stack.PacketBufferPtr) int { +func calculateFragmentReserve(pkt *stack.PacketBuffer) int { return pkt.AvailableHeaderBytes() + len(pkt.NetworkHeader().Slice()) + header.IPv6FragmentHeaderSize } @@ -2796,7 +2796,7 @@ func (e *endpoint) getFragmentID() uint32 { return id } -func buildNextFragment(pf *fragmentation.PacketFragmenter, originalIPHeaders header.IPv6, transportProto tcpip.TransportProtocolNumber, id uint32) (stack.PacketBufferPtr, bool) { +func buildNextFragment(pf *fragmentation.PacketFragmenter, originalIPHeaders header.IPv6, transportProto tcpip.TransportProtocolNumber, id uint32) (*stack.PacketBuffer, bool) { fragPkt, offset, copied, more := pf.BuildNextFragment() fragPkt.NetworkProtocolNumber = ProtocolNumber diff --git a/pkg/tcpip/network/ipv6/ipv6_test.go b/pkg/tcpip/network/ipv6/ipv6_test.go index cbeb7a81a..bd56f5df9 100644 --- a/pkg/tcpip/network/ipv6/ipv6_test.go +++ b/pkg/tcpip/network/ipv6/ipv6_test.go @@ -169,7 +169,7 @@ func testReceiveUDP(t *testing.T, s *stack.Stack, e *channel.Endpoint, src, dst } } -func compareFragments(packets []stack.PacketBufferPtr, sourcePacket stack.PacketBufferPtr, mtu uint32, wantFragments []fragmentInfo, proto tcpip.TransportProtocolNumber) error { +func compareFragments(packets []*stack.PacketBuffer, sourcePacket *stack.PacketBuffer, mtu uint32, wantFragments []fragmentInfo, proto tcpip.TransportProtocolNumber) error { // sourcePacket does not have its IP Header populated. Let's copy the one // from the first fragment. source := header.IPv6(packets[0].NetworkHeader().Slice()) @@ -2672,7 +2672,7 @@ func (*limitedMatcher) Name() string { } // Match implements Matcher.Match. -func (lm *limitedMatcher) Match(stack.Hook, stack.PacketBufferPtr, string, string) (bool, bool) { +func (lm *limitedMatcher) Match(stack.Hook, *stack.PacketBuffer, string, string) (bool, bool) { if lm.limit == 0 { return true, false } diff --git a/pkg/tcpip/network/multicast_group_test.go b/pkg/tcpip/network/multicast_group_test.go index 7bc9b918d..c49e46607 100644 --- a/pkg/tcpip/network/multicast_group_test.go +++ b/pkg/tcpip/network/multicast_group_test.go @@ -81,7 +81,7 @@ var ( // validateMLDPacket checks that a passed PacketInfo is an IPv6 MLD packet // sent to the provided address with the passed fields set. -func validateMLDPacket(t *testing.T, p stack.PacketBufferPtr, remoteAddress tcpip.Address, mldType uint8, maxRespTime byte, groupAddress tcpip.Address) { +func validateMLDPacket(t *testing.T, p *stack.PacketBuffer, remoteAddress tcpip.Address, mldType uint8, maxRespTime byte, groupAddress tcpip.Address) { t.Helper() payload := stack.PayloadSince(p.NetworkHeader()) @@ -101,7 +101,7 @@ func validateMLDPacket(t *testing.T, p stack.PacketBufferPtr, remoteAddress tcpi ) } -func validateMLDv2ReportPacket(t *testing.T, p stack.PacketBufferPtr, addrs []tcpip.Address, recordType header.MLDv2ReportRecordType) { +func validateMLDv2ReportPacket(t *testing.T, p *stack.PacketBuffer, addrs []tcpip.Address, recordType header.MLDv2ReportRecordType) { t.Helper() payload := stack.PayloadSince(p.NetworkHeader()) defer payload.Release() @@ -110,7 +110,7 @@ func validateMLDv2ReportPacket(t *testing.T, p stack.PacketBufferPtr, addrs []tc // validateIGMPPacket checks that a passed PacketInfo is an IPv4 IGMP packet // sent to the provided address with the passed fields set. -func validateIGMPPacket(t *testing.T, p stack.PacketBufferPtr, remoteAddress tcpip.Address, igmpType uint8, maxRespTime byte, groupAddress tcpip.Address) { +func validateIGMPPacket(t *testing.T, p *stack.PacketBuffer, remoteAddress tcpip.Address, igmpType uint8, maxRespTime byte, groupAddress tcpip.Address) { t.Helper() payload := stack.PayloadSince(p.NetworkHeader()) @@ -129,7 +129,7 @@ func validateIGMPPacket(t *testing.T, p stack.PacketBufferPtr, remoteAddress tcp ) } -func validateIGMPv3ReportPacket(t *testing.T, p stack.PacketBufferPtr, addrs []tcpip.Address, recordType header.IGMPv3ReportRecordType) { +func validateIGMPv3ReportPacket(t *testing.T, p *stack.PacketBuffer, addrs []tcpip.Address, recordType header.IGMPv3ReportRecordType) { t.Helper() payload := stack.PayloadSince(p.NetworkHeader()) @@ -518,7 +518,7 @@ func TestMGPJoinGroup(t *testing.T) { type subTest struct { name string enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr) + validateReport func(*testing.T, *stack.PacketBuffer) checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) } @@ -546,7 +546,7 @@ func TestMGPJoinGroup(t *testing.T) { // V2 query for unrelated group. createAndInjectIGMPPacket(e, igmpMembershipQuery, 1, ipv4MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPPacket(t, p, ipv4MulticastAddr1, igmpv2MembershipReport, 0, ipv4MulticastAddr1) @@ -556,7 +556,7 @@ func TestMGPJoinGroup(t *testing.T) { { name: "V3", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{ipv4MulticastAddr1}, header.IGMPv3ReportRecordChangeToExcludeMode) @@ -581,7 +581,7 @@ func TestMGPJoinGroup(t *testing.T) { // V1 query for unrelated group. createAndInjectMLDPacket(e, mldQuery, 0, ipv6MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDPacket(t, p, ipv6MulticastAddr1, mldReport, 0, ipv6MulticastAddr1) @@ -591,7 +591,7 @@ func TestMGPJoinGroup(t *testing.T) { { name: "V2", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{ipv6MulticastAddr1}, header.MLDv2ReportRecordChangeToExcludeMode) @@ -669,8 +669,8 @@ func TestMGPLeaveGroup(t *testing.T) { type subTest struct { name string enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr) - validateLeave func(*testing.T, stack.PacketBufferPtr) + validateReport func(*testing.T, *stack.PacketBuffer) + validateLeave func(*testing.T, *stack.PacketBuffer) leaveCount uint8 checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) } @@ -695,12 +695,12 @@ func TestMGPLeaveGroup(t *testing.T) { // V2 query for unrelated group. createAndInjectIGMPPacket(e, igmpMembershipQuery, 1, ipv4MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPPacket(t, p, ipv4MulticastAddr1, igmpv2MembershipReport, 0, ipv4MulticastAddr1) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPPacket(t, p, header.IPv4AllRoutersGroup, igmpLeaveGroup, 0, ipv4MulticastAddr1) @@ -711,12 +711,12 @@ func TestMGPLeaveGroup(t *testing.T) { { name: "V3", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{ipv4MulticastAddr1}, header.IGMPv3ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{ipv4MulticastAddr1}, header.IGMPv3ReportRecordChangeToIncludeMode) @@ -739,12 +739,12 @@ func TestMGPLeaveGroup(t *testing.T) { // V1 query for unrelated group. createAndInjectMLDPacket(e, mldQuery, 0, ipv6MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDPacket(t, p, ipv6MulticastAddr1, mldReport, 0, ipv6MulticastAddr1) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDPacket(t, p, header.IPv6AllRoutersLinkLocalMulticastAddress, mldDone, 0, ipv6MulticastAddr1) @@ -755,12 +755,12 @@ func TestMGPLeaveGroup(t *testing.T) { { name: "V2", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{ipv6MulticastAddr1}, header.MLDv2ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{ipv6MulticastAddr1}, header.MLDv2ReportRecordChangeToIncludeMode) @@ -837,7 +837,7 @@ func TestMGPQueryMessages(t *testing.T) { type subTest struct { name string enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr, bool) + validateReport func(*testing.T, *stack.PacketBuffer, bool) checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) rxQuery func(*channel.Endpoint, uint8, tcpip.Address) } @@ -868,7 +868,7 @@ func TestMGPQueryMessages(t *testing.T) { // V2 query for unrelated group. createAndInjectIGMPPacket(e, igmpMembershipQuery, 1, ipv4MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, _ bool) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, _ bool) { t.Helper() validateIGMPPacket(t, p, ipv4MulticastAddr1, igmpv2MembershipReport, 0, ipv4MulticastAddr1) @@ -881,7 +881,7 @@ func TestMGPQueryMessages(t *testing.T) { { name: "V3", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, queryResponse bool) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, queryResponse bool) { t.Helper() recordType := header.IGMPv3ReportRecordChangeToExcludeMode @@ -917,7 +917,7 @@ func TestMGPQueryMessages(t *testing.T) { // V1 query for unrelated group. createAndInjectMLDPacket(e, mldQuery, 0, ipv6MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, _ bool) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, _ bool) { t.Helper() validateMLDPacket(t, p, ipv6MulticastAddr1, mldReport, 0, ipv6MulticastAddr1) @@ -930,7 +930,7 @@ func TestMGPQueryMessages(t *testing.T) { { name: "V2", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, queryResponse bool) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, queryResponse bool) { t.Helper() recordType := header.MLDv2ReportRecordChangeToExcludeMode @@ -1059,8 +1059,8 @@ func TestMGPReportMessages(t *testing.T) { type subTest struct { name string enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr) - validateLeave func(*testing.T, stack.PacketBufferPtr) + validateReport func(*testing.T, *stack.PacketBuffer) + validateLeave func(*testing.T, *stack.PacketBuffer) leaveCount uint8 checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) } @@ -1089,7 +1089,7 @@ func TestMGPReportMessages(t *testing.T) { // V2 query for unrelated group. createAndInjectIGMPPacket(e, igmpMembershipQuery, 1, ipv4MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPPacket(t, p, ipv4MulticastAddr1, igmpv2MembershipReport, 0, ipv4MulticastAddr1) @@ -1100,12 +1100,12 @@ func TestMGPReportMessages(t *testing.T) { { name: "V3", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{ipv4MulticastAddr1}, header.IGMPv3ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{ipv4MulticastAddr1}, header.IGMPv3ReportRecordChangeToIncludeMode) @@ -1131,7 +1131,7 @@ func TestMGPReportMessages(t *testing.T) { // V1 query for unrelated group. createAndInjectMLDPacket(e, mldQuery, 0, ipv6MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDPacket(t, p, ipv6MulticastAddr1, mldReport, 0, ipv6MulticastAddr1) @@ -1142,12 +1142,12 @@ func TestMGPReportMessages(t *testing.T) { { name: "V2", enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr) { + validateReport: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{ipv6MulticastAddr1}, header.MLDv2ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{ipv6MulticastAddr1}, header.MLDv2ReportRecordChangeToIncludeMode) @@ -1238,7 +1238,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { name string v1Compatibility bool enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr, tcpip.Address) + validateReport func(*testing.T, *stack.PacketBuffer, tcpip.Address) validateLeave func(*testing.T, *channel.Endpoint, []tcpip.Address) checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) } @@ -1252,7 +1252,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { sentReportStat func(*stack.Stack) *tcpip.StatCounter sentLeaveStat func(*stack.Stack) *tcpip.StatCounter validateReport func(*testing.T, *channel.Endpoint, []tcpip.Address) - validateLeave func(*testing.T, stack.PacketBufferPtr, tcpip.Address) + validateLeave func(*testing.T, *stack.PacketBuffer, tcpip.Address) checkInitialGroups func(*testing.T, *channel.Endpoint, *stack.Stack, *faketime.ManualClock) uint64 checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) subTests []subTest @@ -1273,7 +1273,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { t.Helper() iptestutil.ValidateIGMPv3RecordsAcrossReports(t, e, stackIPv4Addr, addrs, header.IGMPv3ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{addr}, header.IGMPv3ReportRecordChangeToIncludeMode) @@ -1287,7 +1287,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { // V2 query for unrelated group. createAndInjectIGMPPacket(e, igmpMembershipQuery, 1, ipv4MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateIGMPPacket(t, p, addr, igmpv2MembershipReport, 0, addr) @@ -1302,7 +1302,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { name: "V3", v1Compatibility: false, enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{addr}, header.IGMPv3ReportRecordChangeToExcludeMode) @@ -1332,7 +1332,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { iptestutil.ValidateMLDv2RecordsAcrossReports(t, e, linkLocalIPv6Addr1, addrs, header.MLDv2ReportRecordChangeToExcludeMode) }, - validateLeave: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateLeave: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{addr}, header.MLDv2ReportRecordChangeToIncludeMode) @@ -1347,7 +1347,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { // V1 query for unrelated group. createAndInjectMLDPacket(e, mldQuery, 0, ipv6MulticastAddr3, 0 /* extraLength */) }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateMLDPacket(t, p, addr, mldReport, 0, addr) @@ -1363,7 +1363,7 @@ func TestMGPWithNICLifecycle(t *testing.T) { name: "V2", v1Compatibility: false, enterVersion: func(*channel.Endpoint) {}, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{addr}, header.MLDv2ReportRecordChangeToExcludeMode) @@ -1561,7 +1561,7 @@ func TestMGPCoalescedQueryResponseRecords(t *testing.T) { type subTest struct { name string enterVersion func(e *channel.Endpoint) - validateReport func(*testing.T, stack.PacketBufferPtr) + validateReport func(*testing.T, *stack.PacketBuffer) checkStats func(*testing.T, *stack.Stack, uint64, uint64, uint64) } @@ -1581,7 +1581,7 @@ func TestMGPCoalescedQueryResponseRecords(t *testing.T) { maxUnsolicitedResponseDelay time.Duration receivedQueryStat func(*stack.Stack) *tcpip.StatCounter checkInitialGroups func(*testing.T, *channel.Endpoint, *stack.Stack, *faketime.ManualClock) uint64 - validateReport func(*testing.T, stack.PacketBufferPtr, tcpip.Address) + validateReport func(*testing.T, *stack.PacketBuffer, tcpip.Address) checkStats func(*testing.T, *stack.Stack, uint64) genAddr func(uint16) tcpip.Address maxRecordsPerMessage uint16 @@ -1595,7 +1595,7 @@ func TestMGPCoalescedQueryResponseRecords(t *testing.T) { receivedQueryStat: func(s *stack.Stack) *tcpip.StatCounter { return s.Stats().IGMP.PacketsReceived.MembershipQuery }, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateIGMPv3ReportPacket(t, p, []tcpip.Address{addr}, header.IGMPv3ReportRecordChangeToExcludeMode) @@ -1625,7 +1625,7 @@ func TestMGPCoalescedQueryResponseRecords(t *testing.T) { return s.Stats().ICMP.V6.PacketsReceived.MulticastListenerQuery }, checkInitialGroups: checkInitialIPv6Groups, - validateReport: func(t *testing.T, p stack.PacketBufferPtr, addr tcpip.Address) { + validateReport: func(t *testing.T, p *stack.PacketBuffer, addr tcpip.Address) { t.Helper() validateMLDv2ReportPacket(t, p, []tcpip.Address{addr}, header.MLDv2ReportRecordChangeToExcludeMode) diff --git a/pkg/tcpip/stack/conntrack.go b/pkg/tcpip/stack/conntrack.go index 215eb3612..8dcb01aea 100644 --- a/pkg/tcpip/stack/conntrack.go +++ b/pkg/tcpip/stack/conntrack.go @@ -177,7 +177,7 @@ func (cn *conn) timedOut(now tcpip.MonotonicTime) bool { } // update the connection tracking state. -func (cn *conn) update(pkt PacketBufferPtr, reply bool) { +func (cn *conn) update(pkt *PacketBuffer, reply bool) { cn.stateMu.Lock() defer cn.stateMu.Unlock() @@ -269,7 +269,7 @@ func v6NetAndTransHdr(icmpPayload []byte, minTransHdrLen int) (header.Network, [ return netHdr, transHdr[:minTransHdrLen] } -func getEmbeddedNetAndTransHeaders(pkt PacketBufferPtr, netHdrLength int, getNetAndTransHdr netAndTransHeadersFunc, transProto tcpip.TransportProtocolNumber) (header.Network, header.ChecksummableTransport, bool) { +func getEmbeddedNetAndTransHeaders(pkt *PacketBuffer, netHdrLength int, getNetAndTransHdr netAndTransHeadersFunc, transProto tcpip.TransportProtocolNumber) (header.Network, header.ChecksummableTransport, bool) { switch transProto { case header.TCPProtocolNumber: if netAndTransHeader, ok := pkt.Data().PullUp(netHdrLength + header.TCPMinimumSize); ok { @@ -285,7 +285,7 @@ func getEmbeddedNetAndTransHeaders(pkt PacketBufferPtr, netHdrLength int, getNet return nil, nil, false } -func getHeaders(pkt PacketBufferPtr) (netHdr header.Network, transHdr header.Transport, isICMPError bool, ok bool) { +func getHeaders(pkt *PacketBuffer) (netHdr header.Network, transHdr header.Transport, isICMPError bool, ok bool) { switch pkt.TransportProtocolNumber { case header.TCPProtocolNumber: if tcpHeader := header.TCP(pkt.TransportHeader().Slice()); len(tcpHeader) >= header.TCPMinimumSize { @@ -373,7 +373,7 @@ func getTupleIDForRegularPacket(netHdr header.Network, netProto tcpip.NetworkPro } } -func getTupleIDForPacketInICMPError(pkt PacketBufferPtr, getNetAndTransHdr netAndTransHeadersFunc, netProto tcpip.NetworkProtocolNumber, netLen int, transProto tcpip.TransportProtocolNumber) (tupleID, bool) { +func getTupleIDForPacketInICMPError(pkt *PacketBuffer, getNetAndTransHdr netAndTransHeadersFunc, netProto tcpip.NetworkProtocolNumber, netLen int, transProto tcpip.TransportProtocolNumber) (tupleID, bool) { if netHdr, transHdr, ok := getEmbeddedNetAndTransHeaders(pkt, netLen, getNetAndTransHdr, transProto); ok { return tupleID{ srcAddr: netHdr.DestinationAddress(), @@ -396,7 +396,7 @@ const ( getTupleIDOKAndDontAllowNewConn ) -func getTupleIDForEchoPacket(pkt PacketBufferPtr, ident uint16, request bool) tupleID { +func getTupleIDForEchoPacket(pkt *PacketBuffer, ident uint16, request bool) tupleID { netHdr := pkt.Network() tid := tupleID{ srcAddr: netHdr.SourceAddress(), @@ -414,7 +414,7 @@ func getTupleIDForEchoPacket(pkt PacketBufferPtr, ident uint16, request bool) tu return tid } -func getTupleID(pkt PacketBufferPtr) (tupleID, getTupleIDDisposition) { +func getTupleID(pkt *PacketBuffer) (tupleID, getTupleIDDisposition) { switch pkt.TransportProtocolNumber { case header.TCPProtocolNumber: if transHeader := header.TCP(pkt.TransportHeader().Slice()); len(transHeader) >= header.TCPMinimumSize { @@ -504,7 +504,7 @@ func (ct *ConnTrack) init() { // // If the packet's protocol is trackable, the connection's state is updated to // match the contents of the packet. -func (ct *ConnTrack) getConnAndUpdate(pkt PacketBufferPtr, skipChecksumValidation bool) *tuple { +func (ct *ConnTrack) getConnAndUpdate(pkt *PacketBuffer, skipChecksumValidation bool) *tuple { // Get or (maybe) create a connection. t := func() *tuple { var allowNewConn bool @@ -725,7 +725,7 @@ type portOrIdentRange struct { // // Generally, only the first packet of a connection reaches this method; other // packets will be manipulated without needing to modify the connection. -func (cn *conn) performNAT(pkt PacketBufferPtr, hook Hook, r *Route, portsOrIdents portOrIdentRange, natAddress tcpip.Address, dnat, changePort, changeAddress bool) { +func (cn *conn) performNAT(pkt *PacketBuffer, hook Hook, r *Route, portsOrIdents portOrIdentRange, natAddress tcpip.Address, dnat, changePort, changeAddress bool) { lastPortOrIdent := func() uint16 { lastPortOrIdent := uint32(portsOrIdents.start) + portsOrIdents.size - 1 if lastPortOrIdent > math.MaxUint16 { @@ -833,7 +833,7 @@ func (cn *conn) performNAT(pkt PacketBufferPtr, hook Hook, r *Route, portsOrIden // has had NAT performed on it. // // Returns true if the packet can skip the NAT table. -func (cn *conn) handlePacket(pkt PacketBufferPtr, hook Hook, rt *Route) bool { +func (cn *conn) handlePacket(pkt *PacketBuffer, hook Hook, rt *Route) bool { netHdr, transHdr, isICMPError, ok := getHeaders(pkt) if !ok { return false diff --git a/pkg/tcpip/stack/conntrack_test.go b/pkg/tcpip/stack/conntrack_test.go index edcee3024..ef6727f01 100644 --- a/pkg/tcpip/stack/conntrack_test.go +++ b/pkg/tcpip/stack/conntrack_test.go @@ -280,7 +280,7 @@ type genTCPOpts struct { } // genTCPPacket returns an initialized IPv4 TCP packet. -func genTCPPacket(opts genTCPOpts) PacketBufferPtr { +func genTCPPacket(opts genTCPOpts) *PacketBuffer { // Get values from opts. windowSize := uint16(50000) if opts.windowSize != nil { diff --git a/pkg/tcpip/stack/forwarding_test.go b/pkg/tcpip/stack/forwarding_test.go index c54807b21..c04573352 100644 --- a/pkg/tcpip/stack/forwarding_test.go +++ b/pkg/tcpip/stack/forwarding_test.go @@ -80,7 +80,7 @@ func (*fwdTestNetworkEndpoint) DefaultTTL() uint8 { return 123 } -func (f *fwdTestNetworkEndpoint) HandlePacket(pkt PacketBufferPtr) { +func (f *fwdTestNetworkEndpoint) HandlePacket(pkt *PacketBuffer) { if _, _, ok := f.proto.Parse(pkt); !ok { return } @@ -118,7 +118,7 @@ func (f *fwdTestNetworkEndpoint) NetworkProtocolNumber() tcpip.NetworkProtocolNu return f.proto.Number() } -func (f *fwdTestNetworkEndpoint) WritePacket(r *Route, params NetworkHeaderParams, pkt PacketBufferPtr) tcpip.Error { +func (f *fwdTestNetworkEndpoint) WritePacket(r *Route, params NetworkHeaderParams, pkt *PacketBuffer) tcpip.Error { // Add the protocol's header to the packet and send it to the link // endpoint. b := pkt.NetworkHeader().Push(fwdTestNetHeaderLen) @@ -132,7 +132,7 @@ func (f *fwdTestNetworkEndpoint) WritePacket(r *Route, params NetworkHeaderParam return f.nic.WritePacket(r, pkt) } -func (f *fwdTestNetworkEndpoint) WriteHeaderIncludedPacket(r *Route, pkt PacketBufferPtr) tcpip.Error { +func (f *fwdTestNetworkEndpoint) WriteHeaderIncludedPacket(r *Route, pkt *PacketBuffer) tcpip.Error { // The network header should not already be populated. if _, ok := pkt.NetworkHeader().Consume(fwdTestNetHeaderLen); !ok { return &tcpip.ErrMalformedHeader{} @@ -183,7 +183,7 @@ func (*fwdTestNetworkProtocol) ParseAddresses(v []byte) (src, dst tcpip.Address) return tcpip.AddrFrom4Slice(v[srcAddrOffset : srcAddrOffset+4]), tcpip.AddrFrom4Slice(v[dstAddrOffset : dstAddrOffset+4]) } -func (*fwdTestNetworkProtocol) Parse(pkt PacketBufferPtr) (tcpip.TransportProtocolNumber, bool, bool) { +func (*fwdTestNetworkProtocol) Parse(pkt *PacketBuffer) (tcpip.TransportProtocolNumber, bool, bool) { netHeader, ok := pkt.NetworkHeader().Consume(fwdTestNetHeaderLen) if !ok { return 0, false, false @@ -258,16 +258,16 @@ type fwdTestLinkEndpoint struct { linkAddr tcpip.LinkAddress // C is where outbound packets are queued. - C chan PacketBufferPtr + C chan *PacketBuffer } // InjectInbound injects an inbound packet. -func (e *fwdTestLinkEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) { +func (e *fwdTestLinkEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) { e.InjectLinkAddr(protocol, "", pkt) } // InjectLinkAddr injects an inbound packet with a remote link address. -func (e *fwdTestLinkEndpoint) InjectLinkAddr(protocol tcpip.NetworkProtocolNumber, remote tcpip.LinkAddress, pkt PacketBufferPtr) { +func (e *fwdTestLinkEndpoint) InjectLinkAddr(protocol tcpip.NetworkProtocolNumber, remote tcpip.LinkAddress, pkt *PacketBuffer) { e.dispatcher.DeliverNetworkPacket(protocol, pkt) } @@ -329,10 +329,10 @@ func (*fwdTestLinkEndpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (*fwdTestLinkEndpoint) AddHeader(PacketBufferPtr) {} +func (*fwdTestLinkEndpoint) AddHeader(*PacketBuffer) {} // ParseHeader implements stack.LinkEndpoint.ParseHeader. -func (*fwdTestLinkEndpoint) ParseHeader(PacketBufferPtr) bool { return true } +func (*fwdTestLinkEndpoint) ParseHeader(*PacketBuffer) bool { return true } func fwdTestNetFactory(t *testing.T, proto *fwdTestNetworkProtocol) (*faketime.ManualClock, *fwdTestLinkEndpoint, *fwdTestLinkEndpoint) { clock := faketime.NewManualClock() @@ -352,7 +352,7 @@ func fwdTestNetFactory(t *testing.T, proto *fwdTestNetworkProtocol) (*faketime.M // NIC 1 has the link address "a", and added the network address 1. ep1 := &fwdTestLinkEndpoint{ - C: make(chan PacketBufferPtr, 300), + C: make(chan *PacketBuffer, 300), mtu: fwdTestNetDefaultMTU, linkAddr: "a", } @@ -372,7 +372,7 @@ func fwdTestNetFactory(t *testing.T, proto *fwdTestNetworkProtocol) (*faketime.M // NIC 2 has the link address "b", and added the network address 2. ep2 := &fwdTestLinkEndpoint{ - C: make(chan PacketBufferPtr, 300), + C: make(chan *PacketBuffer, 300), mtu: fwdTestNetDefaultMTU, linkAddr: "b", } @@ -436,7 +436,7 @@ func TestForwardingWithStaticResolver(t *testing.T) { Payload: buffer.MakeWithData(buf), })) - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { @@ -480,7 +480,7 @@ func TestForwardingWithFakeResolver(t *testing.T) { Payload: buffer.MakeWithData(buf), })) - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { @@ -591,7 +591,7 @@ func TestForwardingWithFakeResolverPartialTimeout(t *testing.T) { Payload: buffer.MakeWithData(buf), })) - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { @@ -643,7 +643,7 @@ func TestForwardingWithFakeResolverTwoPackets(t *testing.T) { } for i := 0; i < 2; i++ { - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { @@ -698,7 +698,7 @@ func TestForwardingWithFakeResolverManyPackets(t *testing.T) { } for i := 0; i < maxPendingPacketsPerResolution; i++ { - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { @@ -764,7 +764,7 @@ func TestForwardingWithFakeResolverManyResolutions(t *testing.T) { } for i := 0; i < maxPendingResolutions; i++ { - var p PacketBufferPtr + var p *PacketBuffer clock.Advance(proto.addrResolveDelay) select { diff --git a/pkg/tcpip/stack/gro.go b/pkg/tcpip/stack/gro.go index 2a2a30131..11fc83b02 100644 --- a/pkg/tcpip/stack/gro.go +++ b/pkg/tcpip/stack/gro.go @@ -80,7 +80,7 @@ func (gb *groBucket) full() bool { // insert inserts pkt into the bucket. // +checklocks:gb.mu -func (gb *groBucket) insert(pkt PacketBufferPtr, ipHdr []byte, tcpHdr header.TCP, ep NetworkEndpoint) { +func (gb *groBucket) insert(pkt *PacketBuffer, ipHdr []byte, tcpHdr header.TCP, ep NetworkEndpoint) { groPkt := &gb.packetsPrealloc[gb.allocIdxs[gb.count]] *groPkt = groPacket{ pkt: pkt, @@ -96,9 +96,9 @@ func (gb *groBucket) insert(pkt PacketBufferPtr, ipHdr []byte, tcpHdr header.TCP } // removeOldest removes the oldest packet from gb and returns the contained -// PacketBufferPtr. gb must not be empty. +// *PacketBuffer. gb must not be empty. // +checklocks:gb.mu -func (gb *groBucket) removeOldest() PacketBufferPtr { +func (gb *groBucket) removeOldest() *PacketBuffer { pkt := gb.packets.Front() gb.packets.Remove(pkt) gb.count-- @@ -121,7 +121,7 @@ func (gb *groBucket) removeOne(pkt *groPacket) { // none exists. It also returns whether the groPkt should be flushed based on // differences between the two headers. // +checklocks:gb.mu -func (gb *groBucket) findGROPacket4(pkt PacketBufferPtr, ipHdr header.IPv4, tcpHdr header.TCP, ep NetworkEndpoint) (*groPacket, bool) { +func (gb *groBucket) findGROPacket4(pkt *PacketBuffer, ipHdr header.IPv4, tcpHdr header.TCP, ep NetworkEndpoint) (*groPacket, bool) { for groPkt := gb.packets.Front(); groPkt != nil; groPkt = groPkt.Next() { // Do the addresses match? groIPHdr := header.IPv4(groPkt.ipHdr) @@ -163,7 +163,7 @@ func (gb *groBucket) findGROPacket4(pkt PacketBufferPtr, ipHdr header.IPv4, tcpH // none exists. It also returns whether the groPkt should be flushed based on // differences between the two headers. // +checklocks:gb.mu -func (gb *groBucket) findGROPacket6(pkt PacketBufferPtr, ipHdr header.IPv6, tcpHdr header.TCP, ep NetworkEndpoint) (*groPacket, bool) { +func (gb *groBucket) findGROPacket6(pkt *PacketBuffer, ipHdr header.IPv6, tcpHdr header.TCP, ep NetworkEndpoint) (*groPacket, bool) { for groPkt := gb.packets.Front(); groPkt != nil; groPkt = groPkt.Next() { // Do the addresses match? groIPHdr := header.IPv6(groPkt.ipHdr) @@ -216,7 +216,7 @@ func (gb *groBucket) findGROPacket6(pkt PacketBufferPtr, ipHdr header.IPv6, tcpH } // +checklocks:gb.mu -func (gb *groBucket) found(gd *groDispatcher, groPkt *groPacket, flushGROPkt bool, pkt PacketBufferPtr, ipHdr []byte, tcpHdr header.TCP, ep NetworkEndpoint, updateIPHdr func([]byte, int)) { +func (gb *groBucket) found(gd *groDispatcher, groPkt *groPacket, flushGROPkt bool, pkt *PacketBuffer, ipHdr []byte, tcpHdr header.TCP, ep NetworkEndpoint, updateIPHdr func([]byte, int)) { // Flush groPkt or merge the packets. pktSize := pkt.Data().Size() flags := tcpHdr.Flags() @@ -301,7 +301,7 @@ type groPacket struct { groPacketEntry // pkt is the coalesced packet. - pkt PacketBufferPtr + pkt *PacketBuffer // ipHdr is the IP (v4 or v6) header for the coalesced packet. ipHdr []byte @@ -410,7 +410,7 @@ func (gd *groDispatcher) setInterval(interval time.Duration) { } // dispatch sends pkt up the stack after it undergoes GRO coalescing. -func (gd *groDispatcher) dispatch(pkt PacketBufferPtr, netProto tcpip.NetworkProtocolNumber, ep NetworkEndpoint) { +func (gd *groDispatcher) dispatch(pkt *PacketBuffer, netProto tcpip.NetworkProtocolNumber, ep NetworkEndpoint) { // If GRO is disabled simply pass the packet along. if gd.getInterval() == 0 { ep.HandlePacket(pkt) @@ -428,7 +428,7 @@ func (gd *groDispatcher) dispatch(pkt PacketBufferPtr, netProto tcpip.NetworkPro } } -func (gd *groDispatcher) dispatch4(pkt PacketBufferPtr, ep NetworkEndpoint) { +func (gd *groDispatcher) dispatch4(pkt *PacketBuffer, ep NetworkEndpoint) { // Immediately get the IPv4 and TCP headers. We need a way to hash the // packet into its bucket, which requires addresses and ports. Linux // simply gets a hash passed by hardware, but we're not so lucky. @@ -497,7 +497,7 @@ func (gd *groDispatcher) dispatch4(pkt PacketBufferPtr, ep NetworkEndpoint) { bucket.found(gd, groPkt, flushGROPkt, pkt, ipHdr, tcpHdr, ep, updateIPv4Hdr) } -func (gd *groDispatcher) dispatch6(pkt PacketBufferPtr, ep NetworkEndpoint) { +func (gd *groDispatcher) dispatch6(pkt *PacketBuffer, ep NetworkEndpoint) { // Immediately get the IPv6 and TCP headers. We need a way to hash the // packet into its bucket, which requires addresses and ports. Linux // simply gets a hash passed by hardware, but we're not so lucky. @@ -627,7 +627,7 @@ func (gd *groDispatcher) flush() bool { // Returns true iff packets remain. func (gd *groDispatcher) flushSinceOrEqualTo(old time.Time) bool { type pair struct { - pkt PacketBufferPtr + pkt *PacketBuffer ep NetworkEndpoint } diff --git a/pkg/tcpip/stack/iptables.go b/pkg/tcpip/stack/iptables.go index f961ba8a4..fb0d4a3b0 100644 --- a/pkg/tcpip/stack/iptables.go +++ b/pkg/tcpip/stack/iptables.go @@ -300,7 +300,7 @@ type checkTable struct { // - Calls to dynamic functions, which can allocate. // // +checkescape:hard -func (it *IPTables) shouldSkipOrPopulateTables(tables []checkTable, pkt PacketBufferPtr) bool { +func (it *IPTables) shouldSkipOrPopulateTables(tables []checkTable, pkt *PacketBuffer) bool { switch pkt.NetworkProtocolNumber { case header.IPv4ProtocolNumber, header.IPv6ProtocolNumber: default: @@ -335,7 +335,7 @@ func (it *IPTables) shouldSkipOrPopulateTables(tables []checkTable, pkt PacketBu // that it does not allocate. Note that called functions (e.g. // getConnAndUpdate) can allocate. // TODO(b/233951539): checkescape fails on arm sometimes. Fix and re-add. -func (it *IPTables) CheckPrerouting(pkt PacketBufferPtr, addressEP AddressableEndpoint, inNicName string) bool { +func (it *IPTables) CheckPrerouting(pkt *PacketBuffer, addressEP AddressableEndpoint, inNicName string) bool { tables := [...]checkTable{ { fn: check, @@ -373,7 +373,7 @@ func (it *IPTables) CheckPrerouting(pkt PacketBufferPtr, addressEP AddressableEn // that it does not allocate. Note that called functions (e.g. // getConnAndUpdate) can allocate. // TODO(b/233951539): checkescape fails on arm sometimes. Fix and re-add. -func (it *IPTables) CheckInput(pkt PacketBufferPtr, inNicName string) bool { +func (it *IPTables) CheckInput(pkt *PacketBuffer, inNicName string) bool { tables := [...]checkTable{ { fn: checkNAT, @@ -413,7 +413,7 @@ func (it *IPTables) CheckInput(pkt PacketBufferPtr, inNicName string) bool { // that it does not allocate. Note that called functions (e.g. // getConnAndUpdate) can allocate. // TODO(b/233951539): checkescape fails on arm sometimes. Fix and re-add. -func (it *IPTables) CheckForward(pkt PacketBufferPtr, inNicName, outNicName string) bool { +func (it *IPTables) CheckForward(pkt *PacketBuffer, inNicName, outNicName string) bool { tables := [...]checkTable{ { fn: check, @@ -445,7 +445,7 @@ func (it *IPTables) CheckForward(pkt PacketBufferPtr, inNicName, outNicName stri // that it does not allocate. Note that called functions (e.g. // getConnAndUpdate) can allocate. // TODO(b/233951539): checkescape fails on arm sometimes. Fix and re-add. -func (it *IPTables) CheckOutput(pkt PacketBufferPtr, r *Route, outNicName string) bool { +func (it *IPTables) CheckOutput(pkt *PacketBuffer, r *Route, outNicName string) bool { tables := [...]checkTable{ { fn: check, @@ -489,7 +489,7 @@ func (it *IPTables) CheckOutput(pkt PacketBufferPtr, r *Route, outNicName string // that it does not allocate. Note that called functions (e.g. // getConnAndUpdate) can allocate. // TODO(b/233951539): checkescape fails on arm sometimes. Fix and re-add. -func (it *IPTables) CheckPostrouting(pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, outNicName string) bool { +func (it *IPTables) CheckPostrouting(pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, outNicName string) bool { tables := [...]checkTable{ { fn: check, @@ -520,16 +520,16 @@ func (it *IPTables) CheckPostrouting(pkt PacketBufferPtr, r *Route, addressEP Ad // Note: this used to omit the *IPTables parameter, but doing so caused // unnecessary allocations. -type checkTableFn func(it *IPTables, table Table, hook Hook, pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool +type checkTableFn func(it *IPTables, table Table, hook Hook, pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool -func checkNAT(it *IPTables, table Table, hook Hook, pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { +func checkNAT(it *IPTables, table Table, hook Hook, pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { return it.checkNAT(table, hook, pkt, r, addressEP, inNicName, outNicName) } // checkNAT runs the packet through the NAT table. // // See check. -func (it *IPTables) checkNAT(table Table, hook Hook, pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { +func (it *IPTables) checkNAT(table Table, hook Hook, pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { t := pkt.tuple if t != nil && t.conn.handlePacket(pkt, hook, r) { return true @@ -567,7 +567,7 @@ func (it *IPTables) checkNAT(table Table, hook Hook, pkt PacketBufferPtr, r *Rou return true } -func check(it *IPTables, table Table, hook Hook, pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { +func check(it *IPTables, table Table, hook Hook, pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { return it.check(table, hook, pkt, r, addressEP, inNicName, outNicName) } @@ -576,7 +576,7 @@ func check(it *IPTables, table Table, hook Hook, pkt PacketBufferPtr, r *Route, // network stack or tables, or false when it must be dropped. // // Precondition: The packet's network and transport header must be set. -func (it *IPTables) check(table Table, hook Hook, pkt PacketBufferPtr, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { +func (it *IPTables) check(table Table, hook Hook, pkt *PacketBuffer, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) bool { ruleIdx := table.BuiltinChains[hook] switch verdict := it.checkChain(hook, pkt, table, ruleIdx, r, addressEP, inNicName, outNicName); verdict { // If the table returns Accept, move on to the next table. @@ -629,7 +629,7 @@ func (it *IPTables) startReaper(interval time.Duration) { // Preconditions: // - pkt is a IPv4 packet of at least length header.IPv4MinimumSize. // - pkt.NetworkHeader is not nil. -func (it *IPTables) checkChain(hook Hook, pkt PacketBufferPtr, table Table, ruleIdx int, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) chainVerdict { +func (it *IPTables) checkChain(hook Hook, pkt *PacketBuffer, table Table, ruleIdx int, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) chainVerdict { // Start from ruleIdx and walk the list of rules until a rule gives us // a verdict. for ruleIdx < len(table.Rules) { @@ -679,7 +679,7 @@ func (it *IPTables) checkChain(hook Hook, pkt PacketBufferPtr, table Table, rule // // * pkt is a IPv4 packet of at least length header.IPv4MinimumSize. // * pkt.NetworkHeader is not nil. -func (it *IPTables) checkRule(hook Hook, pkt PacketBufferPtr, table Table, ruleIdx int, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) (RuleVerdict, int) { +func (it *IPTables) checkRule(hook Hook, pkt *PacketBuffer, table Table, ruleIdx int, r *Route, addressEP AddressableEndpoint, inNicName, outNicName string) (RuleVerdict, int) { rule := table.Rules[ruleIdx] // Check whether the packet matches the IP header filter. diff --git a/pkg/tcpip/stack/iptables_targets.go b/pkg/tcpip/stack/iptables_targets.go index 9c9f21f51..f47b21fe0 100644 --- a/pkg/tcpip/stack/iptables_targets.go +++ b/pkg/tcpip/stack/iptables_targets.go @@ -30,7 +30,7 @@ type AcceptTarget struct { } // Action implements Target.Action. -func (*AcceptTarget) Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { +func (*AcceptTarget) Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { return RuleAccept, 0 } @@ -41,14 +41,14 @@ type DropTarget struct { } // Action implements Target.Action. -func (*DropTarget) Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { +func (*DropTarget) Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { return RuleDrop, 0 } // RejectIPv4WithHandler handles rejecting a packet. type RejectIPv4WithHandler interface { // SendRejectionError sends an error packet in response to the packet. - SendRejectionError(pkt PacketBufferPtr, rejectWith RejectIPv4WithICMPType, inputHook bool) tcpip.Error + SendRejectionError(pkt *PacketBuffer, rejectWith RejectIPv4WithICMPType, inputHook bool) tcpip.Error } // RejectIPv4WithICMPType indicates the type of ICMP error that should be sent. @@ -73,7 +73,7 @@ type RejectIPv4Target struct { } // Action implements Target.Action. -func (rt *RejectIPv4Target) Action(pkt PacketBufferPtr, hook Hook, _ *Route, _ AddressableEndpoint) (RuleVerdict, int) { +func (rt *RejectIPv4Target) Action(pkt *PacketBuffer, hook Hook, _ *Route, _ AddressableEndpoint) (RuleVerdict, int) { switch hook { case Input, Forward, Output: // There is nothing reasonable for us to do in response to an error here; @@ -90,7 +90,7 @@ func (rt *RejectIPv4Target) Action(pkt PacketBufferPtr, hook Hook, _ *Route, _ A // RejectIPv6WithHandler handles rejecting a packet. type RejectIPv6WithHandler interface { // SendRejectionError sends an error packet in response to the packet. - SendRejectionError(pkt PacketBufferPtr, rejectWith RejectIPv6WithICMPType, forwardingHook bool) tcpip.Error + SendRejectionError(pkt *PacketBuffer, rejectWith RejectIPv6WithICMPType, forwardingHook bool) tcpip.Error } // RejectIPv6WithICMPType indicates the type of ICMP error that should be sent. @@ -113,7 +113,7 @@ type RejectIPv6Target struct { } // Action implements Target.Action. -func (rt *RejectIPv6Target) Action(pkt PacketBufferPtr, hook Hook, _ *Route, _ AddressableEndpoint) (RuleVerdict, int) { +func (rt *RejectIPv6Target) Action(pkt *PacketBuffer, hook Hook, _ *Route, _ AddressableEndpoint) (RuleVerdict, int) { switch hook { case Input, Forward, Output: // There is nothing reasonable for us to do in response to an error here; @@ -135,7 +135,7 @@ type ErrorTarget struct { } // Action implements Target.Action. -func (*ErrorTarget) Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { +func (*ErrorTarget) Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { log.Debugf("ErrorTarget triggered.") return RuleDrop, 0 } @@ -150,7 +150,7 @@ type UserChainTarget struct { } // Action implements Target.Action. -func (*UserChainTarget) Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { +func (*UserChainTarget) Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { panic("UserChainTarget should never be called.") } @@ -162,7 +162,7 @@ type ReturnTarget struct { } // Action implements Target.Action. -func (*ReturnTarget) Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { +func (*ReturnTarget) Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) { return RuleReturn, 0 } @@ -195,7 +195,7 @@ type DNATTarget struct { } // Action implements Target.Action. -func (rt *DNATTarget) Action(pkt PacketBufferPtr, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { +func (rt *DNATTarget) Action(pkt *PacketBuffer, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { // Sanity check. if rt.NetworkProtocol != pkt.NetworkProtocolNumber { panic(fmt.Sprintf( @@ -229,7 +229,7 @@ type RedirectTarget struct { } // Action implements Target.Action. -func (rt *RedirectTarget) Action(pkt PacketBufferPtr, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { +func (rt *RedirectTarget) Action(pkt *PacketBuffer, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { // Sanity check. if rt.NetworkProtocol != pkt.NetworkProtocolNumber { panic(fmt.Sprintf( @@ -277,7 +277,7 @@ type SNATTarget struct { ChangePort bool } -func dnatAction(pkt PacketBufferPtr, hook Hook, r *Route, port uint16, address tcpip.Address, changePort, changeAddress bool) (RuleVerdict, int) { +func dnatAction(pkt *PacketBuffer, hook Hook, r *Route, port uint16, address tcpip.Address, changePort, changeAddress bool) (RuleVerdict, int) { return natAction(pkt, hook, r, portOrIdentRange{start: port, size: 1}, address, true /* dnat */, changePort, changeAddress) } @@ -298,7 +298,7 @@ func targetPortRangeForTCPAndUDP(originalSrcPort uint16) portOrIdentRange { } } -func snatAction(pkt PacketBufferPtr, hook Hook, r *Route, port uint16, address tcpip.Address, changePort, changeAddress bool) (RuleVerdict, int) { +func snatAction(pkt *PacketBuffer, hook Hook, r *Route, port uint16, address tcpip.Address, changePort, changeAddress bool) (RuleVerdict, int) { portsOrIdents := portOrIdentRange{start: port, size: 1} switch pkt.TransportProtocolNumber { @@ -321,7 +321,7 @@ func snatAction(pkt PacketBufferPtr, hook Hook, r *Route, port uint16, address t return natAction(pkt, hook, r, portsOrIdents, address, false /* dnat */, changePort, changeAddress) } -func natAction(pkt PacketBufferPtr, hook Hook, r *Route, portsOrIdents portOrIdentRange, address tcpip.Address, dnat, changePort, changeAddress bool) (RuleVerdict, int) { +func natAction(pkt *PacketBuffer, hook Hook, r *Route, portsOrIdents portOrIdentRange, address tcpip.Address, dnat, changePort, changeAddress bool) (RuleVerdict, int) { // Drop the packet if network and transport header are not set. if len(pkt.NetworkHeader().Slice()) == 0 || len(pkt.TransportHeader().Slice()) == 0 { return RuleDrop, 0 @@ -336,7 +336,7 @@ func natAction(pkt PacketBufferPtr, hook Hook, r *Route, portsOrIdents portOrIde } // Action implements Target.Action. -func (st *SNATTarget) Action(pkt PacketBufferPtr, hook Hook, r *Route, _ AddressableEndpoint) (RuleVerdict, int) { +func (st *SNATTarget) Action(pkt *PacketBuffer, hook Hook, r *Route, _ AddressableEndpoint) (RuleVerdict, int) { // Sanity check. if st.NetworkProtocol != pkt.NetworkProtocolNumber { panic(fmt.Sprintf( @@ -363,7 +363,7 @@ type MasqueradeTarget struct { } // Action implements Target.Action. -func (mt *MasqueradeTarget) Action(pkt PacketBufferPtr, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { +func (mt *MasqueradeTarget) Action(pkt *PacketBuffer, hook Hook, r *Route, addressEP AddressableEndpoint) (RuleVerdict, int) { // Sanity check. if mt.NetworkProtocol != pkt.NetworkProtocolNumber { panic(fmt.Sprintf( diff --git a/pkg/tcpip/stack/iptables_test.go b/pkg/tcpip/stack/iptables_test.go index 1265cbeb0..f50d35d49 100644 --- a/pkg/tcpip/stack/iptables_test.go +++ b/pkg/tcpip/stack/iptables_test.go @@ -41,7 +41,7 @@ var ( dstAddr = testutil.MustParse6("c::3") ) -func v6PacketBufferWithSrcAddr(srcAddr tcpip.Address) PacketBufferPtr { +func v6PacketBufferWithSrcAddr(srcAddr tcpip.Address) *PacketBuffer { pkt := NewPacketBuffer(PacketBufferOptions{ ReserveHeaderBytes: header.IPv6MinimumSize + header.UDPMinimumSize, }) @@ -69,7 +69,7 @@ func v6PacketBufferWithSrcAddr(srcAddr tcpip.Address) PacketBufferPtr { return pkt } -func v6PacketBuffer() PacketBufferPtr { +func v6PacketBuffer() *PacketBuffer { return v6PacketBufferWithSrcAddr(srcAddr) } @@ -241,19 +241,19 @@ func TestNATedConnectionReap(t *testing.T) { func TestNATAlwaysPerformed(t *testing.T) { tests := []struct { name string - dnatHook func(*testing.T, *IPTables, PacketBufferPtr) - snatHook func(*testing.T, *IPTables, PacketBufferPtr) + dnatHook func(*testing.T, *IPTables, *PacketBuffer) + snatHook func(*testing.T, *IPTables, *PacketBuffer) }{ { name: "Prerouting and Input", - dnatHook: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr) { + dnatHook: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer) { t.Helper() if !iptables.CheckPrerouting(pkt, nil /* addressEP */, "" /* inNicName */) { t.Fatal("got iptables.CheckPrerouting(...) = false, want = true") } }, - snatHook: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr) { + snatHook: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer) { t.Helper() if !iptables.CheckInput(pkt, "" /* inNicName */) { @@ -263,7 +263,7 @@ func TestNATAlwaysPerformed(t *testing.T) { }, { name: "Output and Postrouting", - dnatHook: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr) { + dnatHook: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer) { t.Helper() // Output hook depends on a route but if the route is local, we don't @@ -277,7 +277,7 @@ func TestNATAlwaysPerformed(t *testing.T) { t.Fatal("got iptables.CheckOutput(...) = false, want = true") } }, - snatHook: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr) { + snatHook: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer) { t.Helper() // Postrouting hook depends on a route but if the route is local, we @@ -329,11 +329,11 @@ func TestNATConflict(t *testing.T) { tests := []struct { name string - checkIPTables func(*testing.T, *IPTables, PacketBufferPtr, bool) + checkIPTables func(*testing.T, *IPTables, *PacketBuffer, bool) }{ { name: "Prerouting and Input", - checkIPTables: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr, lastHookOK bool) { + checkIPTables: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer, lastHookOK bool) { t.Helper() if !iptables.CheckPrerouting(pkt, nil /* addressEP */, "" /* inNicName */) { @@ -346,7 +346,7 @@ func TestNATConflict(t *testing.T) { }, { name: "Output and Postrouting", - checkIPTables: func(t *testing.T, iptables *IPTables, pkt PacketBufferPtr, lastHookOK bool) { + checkIPTables: func(t *testing.T, iptables *IPTables, pkt *PacketBuffer, lastHookOK bool) { t.Helper() // Output and Postrouting hooks depends on a route but if the route is diff --git a/pkg/tcpip/stack/iptables_types.go b/pkg/tcpip/stack/iptables_types.go index 7240cb0d6..86aef6021 100644 --- a/pkg/tcpip/stack/iptables_types.go +++ b/pkg/tcpip/stack/iptables_types.go @@ -267,7 +267,7 @@ func EmptyFilter6() IPHeaderFilter { // // Preconditions: pkt.NetworkHeader is set and is at least of the minimal IPv4 // or IPv6 header length. -func (fl IPHeaderFilter) match(pkt PacketBufferPtr, hook Hook, inNicName, outNicName string) bool { +func (fl IPHeaderFilter) match(pkt *PacketBuffer, hook Hook, inNicName, outNicName string) bool { // Extract header fields. var ( transProto tcpip.TransportProtocolNumber @@ -375,7 +375,7 @@ type Matcher interface { // used for suspicious packets. // // Precondition: packet.NetworkHeader is set. - Match(hook Hook, packet PacketBufferPtr, inputInterfaceName, outputInterfaceName string) (matches bool, hotdrop bool) + Match(hook Hook, packet *PacketBuffer, inputInterfaceName, outputInterfaceName string) (matches bool, hotdrop bool) } // A Target is the interface for taking an action for a packet. @@ -383,5 +383,5 @@ type Target interface { // Action takes an action on the packet and returns a verdict on how // traversal should (or should not) continue. If the return value is // Jump, it also returns the index of the rule to jump to. - Action(PacketBufferPtr, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) + Action(*PacketBuffer, Hook, *Route, AddressableEndpoint) (RuleVerdict, int) } diff --git a/pkg/tcpip/stack/ndp_test.go b/pkg/tcpip/stack/ndp_test.go index 75f3ae5f5..7d40f7866 100644 --- a/pkg/tcpip/stack/ndp_test.go +++ b/pkg/tcpip/stack/ndp_test.go @@ -1215,7 +1215,7 @@ func TestSetNDPConfigurations(t *testing.T) { // raBuf returns a valid NDP Router Advertisement with options, router // preference and DHCPv6 configurations specified. -func raBuf(ip tcpip.Address, rl uint16, managedAddress, otherConfigurations bool, prf header.NDPRoutePreference, optSer header.NDPOptionsSerializer) stack.PacketBufferPtr { +func raBuf(ip tcpip.Address, rl uint16, managedAddress, otherConfigurations bool, prf header.NDPRoutePreference, optSer header.NDPOptionsSerializer) *stack.PacketBuffer { const flagsByte = 1 const routerLifetimeOffset = 2 @@ -1266,7 +1266,7 @@ func raBuf(ip tcpip.Address, rl uint16, managedAddress, otherConfigurations bool // // Note, raBufWithOpts does not populate any of the RA fields other than the // Router Lifetime. -func raBufWithOpts(ip tcpip.Address, rl uint16, optSer header.NDPOptionsSerializer) stack.PacketBufferPtr { +func raBufWithOpts(ip tcpip.Address, rl uint16, optSer header.NDPOptionsSerializer) *stack.PacketBuffer { return raBuf(ip, rl, false /* managedAddress */, false /* otherConfigurations */, 0 /* prf */, optSer) } @@ -1275,7 +1275,7 @@ func raBufWithOpts(ip tcpip.Address, rl uint16, optSer header.NDPOptionsSerializ // // Note, raBufWithDHCPv6 does not populate any of the RA fields other than the // DHCPv6 related ones. -func raBufWithDHCPv6(ip tcpip.Address, managedAddresses, otherConfigurations bool) stack.PacketBufferPtr { +func raBufWithDHCPv6(ip tcpip.Address, managedAddresses, otherConfigurations bool) *stack.PacketBuffer { return raBuf(ip, 0, managedAddresses, otherConfigurations, 0 /* prf */, header.NDPOptionsSerializer{}) } @@ -1283,7 +1283,7 @@ func raBufWithDHCPv6(ip tcpip.Address, managedAddresses, otherConfigurations boo // // Note, raBuf does not populate any of the RA fields other than the // Router Lifetime. -func raBufSimple(ip tcpip.Address, rl uint16) stack.PacketBufferPtr { +func raBufSimple(ip tcpip.Address, rl uint16) *stack.PacketBuffer { return raBufWithOpts(ip, rl, header.NDPOptionsSerializer{}) } @@ -1291,7 +1291,7 @@ func raBufSimple(ip tcpip.Address, rl uint16) stack.PacketBufferPtr { // // Note, raBufWithPrf does not populate any of the RA fields other than the // Router Lifetime and Default Router Preference fields. -func raBufWithPrf(ip tcpip.Address, rl uint16, prf header.NDPRoutePreference) stack.PacketBufferPtr { +func raBufWithPrf(ip tcpip.Address, rl uint16, prf header.NDPRoutePreference) *stack.PacketBuffer { return raBuf(ip, rl, false /* managedAddress */, false /* otherConfigurations */, prf, header.NDPOptionsSerializer{}) } @@ -1300,7 +1300,7 @@ func raBufWithPrf(ip tcpip.Address, rl uint16, prf header.NDPRoutePreference) st // // Note, raBufWithPI does not populate any of the RA fields other than the // Router Lifetime. -func raBufWithPI(ip tcpip.Address, rl uint16, prefix tcpip.AddressWithPrefix, onLink, auto bool, vl, pl uint32) stack.PacketBufferPtr { +func raBufWithPI(ip tcpip.Address, rl uint16, prefix tcpip.AddressWithPrefix, onLink, auto bool, vl, pl uint32) *stack.PacketBuffer { flags := uint8(0) if onLink { // The OnLink flag is the 7th bit in the flags byte. @@ -1337,7 +1337,7 @@ func raBufWithPI(ip tcpip.Address, rl uint16, prefix tcpip.AddressWithPrefix, on // Information option. // // All fields in the RA will be zero except the RIO option. -func raBufWithRIO(t *testing.T, ip tcpip.Address, prefix tcpip.AddressWithPrefix, lifetimeSeconds uint32, prf header.NDPRoutePreference) stack.PacketBufferPtr { +func raBufWithRIO(t *testing.T, ip tcpip.Address, prefix tcpip.AddressWithPrefix, lifetimeSeconds uint32, prf header.NDPRoutePreference) *stack.PacketBuffer { // buf will hold the route information option after the Type and Length // fields. // @@ -1380,7 +1380,7 @@ func TestDynamicConfigurationsDisabled(t *testing.T) { tests := []struct { name string config func(bool) ipv6.NDPConfigurations - ra stack.PacketBufferPtr + ra *stack.PacketBuffer }{ { name: "No Router Discovery", @@ -1569,14 +1569,14 @@ func TestOffLinkRouteDiscovery(t *testing.T) { discoverMoreSpecificRoutes bool dest tcpip.Subnet - ra func(*testing.T, tcpip.Address, uint16, header.NDPRoutePreference) stack.PacketBufferPtr + ra func(*testing.T, tcpip.Address, uint16, header.NDPRoutePreference) *stack.PacketBuffer }{ { name: "Default router discovery", discoverDefaultRouters: true, discoverMoreSpecificRoutes: false, dest: header.IPv6EmptySubnet, - ra: func(_ *testing.T, router tcpip.Address, lifetimeSeconds uint16, prf header.NDPRoutePreference) stack.PacketBufferPtr { + ra: func(_ *testing.T, router tcpip.Address, lifetimeSeconds uint16, prf header.NDPRoutePreference) *stack.PacketBuffer { return raBufWithPrf(router, lifetimeSeconds, prf) }, }, @@ -1585,7 +1585,7 @@ func TestOffLinkRouteDiscovery(t *testing.T) { discoverDefaultRouters: false, discoverMoreSpecificRoutes: true, dest: moreSpecificPrefix.Subnet(), - ra: func(t *testing.T, router tcpip.Address, lifetimeSeconds uint16, prf header.NDPRoutePreference) stack.PacketBufferPtr { + ra: func(t *testing.T, router tcpip.Address, lifetimeSeconds uint16, prf header.NDPRoutePreference) *stack.PacketBuffer { return raBufWithRIO(t, router, moreSpecificPrefix, uint32(lifetimeSeconds), prf) }, }, diff --git a/pkg/tcpip/stack/nic.go b/pkg/tcpip/stack/nic.go index 38a9d4679..73836285b 100644 --- a/pkg/tcpip/stack/nic.go +++ b/pkg/tcpip/stack/nic.go @@ -140,7 +140,7 @@ type delegatingQueueingDiscipline struct { func (*delegatingQueueingDiscipline) Close() {} // WritePacket passes the packet through to the underlying LinkWriter's WritePackets. -func (qDisc *delegatingQueueingDiscipline) WritePacket(pkt PacketBufferPtr) tcpip.Error { +func (qDisc *delegatingQueueingDiscipline) WritePacket(pkt *PacketBuffer) tcpip.Error { var pkts PacketBufferList pkts.PushBack(pkt) _, err := qDisc.LinkWriter.WritePackets(pkts) @@ -339,7 +339,7 @@ func (n *nic) IsLoopback() bool { } // WritePacket implements NetworkEndpoint. -func (n *nic) WritePacket(r *Route, pkt PacketBufferPtr) tcpip.Error { +func (n *nic) WritePacket(r *Route, pkt *PacketBuffer) tcpip.Error { routeInfo, _, err := r.resolvedFields(nil) switch err.(type) { case nil: @@ -370,7 +370,7 @@ func (n *nic) WritePacket(r *Route, pkt PacketBufferPtr) tcpip.Error { } // WritePacketToRemote implements NetworkInterface. -func (n *nic) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, pkt PacketBufferPtr) tcpip.Error { +func (n *nic) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, pkt *PacketBuffer) tcpip.Error { pkt.EgressRoute = RouteInfo{ routeInfo: routeInfo{ NetProto: pkt.NetworkProtocolNumber, @@ -381,19 +381,19 @@ func (n *nic) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, pkt PacketBu return n.writePacket(pkt) } -func (n *nic) writePacket(pkt PacketBufferPtr) tcpip.Error { +func (n *nic) writePacket(pkt *PacketBuffer) tcpip.Error { n.NetworkLinkEndpoint.AddHeader(pkt) return n.writeRawPacket(pkt) } -func (n *nic) writeRawPacketWithLinkHeaderInPayload(pkt PacketBufferPtr) tcpip.Error { +func (n *nic) writeRawPacketWithLinkHeaderInPayload(pkt *PacketBuffer) tcpip.Error { if !n.NetworkLinkEndpoint.ParseHeader(pkt) { return &tcpip.ErrMalformedHeader{} } return n.writeRawPacket(pkt) } -func (n *nic) writeRawPacket(pkt PacketBufferPtr) tcpip.Error { +func (n *nic) writeRawPacket(pkt *PacketBuffer) tcpip.Error { // Always an outgoing packet. pkt.PktType = tcpip.PacketOutgoing if err := n.qDisc.WritePacket(pkt); err != nil { @@ -715,7 +715,7 @@ func (n *nic) isInGroup(addr tcpip.Address) bool { // DeliverNetworkPacket finds the appropriate network protocol endpoint and // hands the packet over for further processing. This function is called when // the NIC receives a packet from the link endpoint. -func (n *nic) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) { +func (n *nic) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) { enabled := n.Enabled() // If the NIC is not yet enabled, don't receive any packets. if !enabled { @@ -738,9 +738,9 @@ func (n *nic) DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt Pac n.gro.dispatch(pkt, protocol, networkEndpoint) } -func (n *nic) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) { +func (n *nic) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) { // Deliver to interested packet endpoints without holding NIC lock. - var packetEPPkt PacketBufferPtr + var packetEPPkt *PacketBuffer defer func() { if !packetEPPkt.IsNil() { packetEPPkt.DecRef() @@ -797,7 +797,7 @@ func (n *nic) DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt Packet // DeliverTransportPacket delivers the packets to the appropriate transport // protocol endpoint. -func (n *nic) DeliverTransportPacket(protocol tcpip.TransportProtocolNumber, pkt PacketBufferPtr) TransportPacketDisposition { +func (n *nic) DeliverTransportPacket(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer) TransportPacketDisposition { state, ok := n.stack.transportProtocols[protocol] if !ok { n.stats.unknownL4ProtocolRcvdPacketCounts.Increment(uint64(protocol)) @@ -857,7 +857,7 @@ func (n *nic) DeliverTransportPacket(protocol tcpip.TransportProtocolNumber, pkt } // DeliverTransportError implements TransportDispatcher. -func (n *nic) DeliverTransportError(local, remote tcpip.Address, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr TransportError, pkt PacketBufferPtr) { +func (n *nic) DeliverTransportError(local, remote tcpip.Address, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr TransportError, pkt *PacketBuffer) { state, ok := n.stack.transportProtocols[trans] if !ok { return @@ -885,7 +885,7 @@ func (n *nic) DeliverTransportError(local, remote tcpip.Address, net tcpip.Netwo } // DeliverRawPacket implements TransportDispatcher. -func (n *nic) DeliverRawPacket(protocol tcpip.TransportProtocolNumber, pkt PacketBufferPtr) { +func (n *nic) DeliverRawPacket(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer) { // For ICMPv4 only we validate the header length for compatibility with // raw(7) ICMP_FILTER. The same check is made in Linux here: // https://github.com/torvalds/linux/blob/70585216/net/ipv4/raw.c#L189. diff --git a/pkg/tcpip/stack/nic_test.go b/pkg/tcpip/stack/nic_test.go index 4946341aa..13450a21a 100644 --- a/pkg/tcpip/stack/nic_test.go +++ b/pkg/tcpip/stack/nic_test.go @@ -68,19 +68,19 @@ func (e *testIPv6Endpoint) MaxHeaderLength() uint16 { } // WritePacket implements NetworkEndpoint.WritePacket. -func (*testIPv6Endpoint) WritePacket(*Route, NetworkHeaderParams, PacketBufferPtr) tcpip.Error { +func (*testIPv6Endpoint) WritePacket(*Route, NetworkHeaderParams, *PacketBuffer) tcpip.Error { return nil } // WriteHeaderIncludedPacket implements // NetworkEndpoint.WriteHeaderIncludedPacket. -func (*testIPv6Endpoint) WriteHeaderIncludedPacket(*Route, PacketBufferPtr) tcpip.Error { +func (*testIPv6Endpoint) WriteHeaderIncludedPacket(*Route, *PacketBuffer) tcpip.Error { // Our tests don't use this so we don't support it. return &tcpip.ErrNotSupported{} } // HandlePacket implements NetworkEndpoint.HandlePacket. -func (*testIPv6Endpoint) HandlePacket(PacketBufferPtr) {} +func (*testIPv6Endpoint) HandlePacket(*PacketBuffer) {} // Close implements NetworkEndpoint.Close. func (e *testIPv6Endpoint) Close() { @@ -155,7 +155,7 @@ func (*testIPv6Protocol) Close() {} func (*testIPv6Protocol) Wait() {} // Parse implements NetworkProtocol.Parse. -func (*testIPv6Protocol) Parse(PacketBufferPtr) (tcpip.TransportProtocolNumber, bool, bool) { +func (*testIPv6Protocol) Parse(*PacketBuffer) (tcpip.TransportProtocolNumber, bool, bool) { return 0, false, false } diff --git a/pkg/tcpip/stack/packet_buffer.go b/pkg/tcpip/stack/packet_buffer.go index 03183c94b..260dc70e9 100644 --- a/pkg/tcpip/stack/packet_buffer.go +++ b/pkg/tcpip/stack/packet_buffer.go @@ -58,9 +58,6 @@ type PacketBufferOptions struct { OnRelease func() } -// PacketBufferPtr is a pointer to a PacketBuffer. -type PacketBufferPtr = *PacketBuffer - // A PacketBuffer contains all the data of a network packet. // // As a PacketBuffer traverses up the stack, it may be necessary to pass it to @@ -172,7 +169,7 @@ type PacketBuffer struct { } // NewPacketBuffer creates a new PacketBuffer with opts. -func NewPacketBuffer(opts PacketBufferOptions) PacketBufferPtr { +func NewPacketBuffer(opts PacketBufferOptions) *PacketBuffer { pk := pkPool.Get().(*PacketBuffer) pk.reset() if opts.ReserveHeaderBytes != 0 { @@ -190,7 +187,7 @@ func NewPacketBuffer(opts PacketBufferOptions) PacketBufferPtr { } // IncRef increments the PacketBuffer's refcount. -func (pk PacketBufferPtr) IncRef() PacketBufferPtr { +func (pk *PacketBuffer) IncRef() *PacketBuffer { pk.packetBufferRefs.IncRef() return pk } @@ -198,7 +195,7 @@ func (pk PacketBufferPtr) IncRef() PacketBufferPtr { // DecRef decrements the PacketBuffer's refcount. If the refcount is // decremented to zero, the PacketBuffer is returned to the PacketBuffer // pool. -func (pk PacketBufferPtr) DecRef() { +func (pk *PacketBuffer) DecRef() { pk.packetBufferRefs.DecRef(func() { if pk.onRelease != nil { pk.onRelease() @@ -209,24 +206,24 @@ func (pk PacketBufferPtr) DecRef() { }) } -func (pk PacketBufferPtr) reset() { +func (pk *PacketBuffer) reset() { *pk = PacketBuffer{} } // ReservedHeaderBytes returns the number of bytes initially reserved for // headers. -func (pk PacketBufferPtr) ReservedHeaderBytes() int { +func (pk *PacketBuffer) ReservedHeaderBytes() int { return pk.reserved } // AvailableHeaderBytes returns the number of bytes currently available for // headers. This is relevant to PacketHeader.Push method only. -func (pk PacketBufferPtr) AvailableHeaderBytes() int { +func (pk *PacketBuffer) AvailableHeaderBytes() int { return pk.reserved - pk.pushed } // VirtioNetHeader returns the handle to virtio-layer header. -func (pk PacketBufferPtr) VirtioNetHeader() PacketHeader { +func (pk *PacketBuffer) VirtioNetHeader() PacketHeader { return PacketHeader{ pk: pk, typ: virtioNetHeader, @@ -234,7 +231,7 @@ func (pk PacketBufferPtr) VirtioNetHeader() PacketHeader { } // LinkHeader returns the handle to link-layer header. -func (pk PacketBufferPtr) LinkHeader() PacketHeader { +func (pk *PacketBuffer) LinkHeader() PacketHeader { return PacketHeader{ pk: pk, typ: linkHeader, @@ -242,7 +239,7 @@ func (pk PacketBufferPtr) LinkHeader() PacketHeader { } // NetworkHeader returns the handle to network-layer header. -func (pk PacketBufferPtr) NetworkHeader() PacketHeader { +func (pk *PacketBuffer) NetworkHeader() PacketHeader { return PacketHeader{ pk: pk, typ: networkHeader, @@ -250,7 +247,7 @@ func (pk PacketBufferPtr) NetworkHeader() PacketHeader { } // TransportHeader returns the handle to transport-layer header. -func (pk PacketBufferPtr) TransportHeader() PacketHeader { +func (pk *PacketBuffer) TransportHeader() PacketHeader { return PacketHeader{ pk: pk, typ: transportHeader, @@ -258,28 +255,28 @@ func (pk PacketBufferPtr) TransportHeader() PacketHeader { } // HeaderSize returns the total size of all headers in bytes. -func (pk PacketBufferPtr) HeaderSize() int { +func (pk *PacketBuffer) HeaderSize() int { return pk.pushed + pk.consumed } // Size returns the size of packet in bytes. -func (pk PacketBufferPtr) Size() int { +func (pk *PacketBuffer) Size() int { return int(pk.buf.Size()) - pk.headerOffset() } // MemSize returns the estimation size of the pk in memory, including backing // buffer data. -func (pk PacketBufferPtr) MemSize() int { +func (pk *PacketBuffer) MemSize() int { return int(pk.buf.Size()) + PacketBufferStructSize } // Data returns the handle to data portion of pk. -func (pk PacketBufferPtr) Data() PacketData { +func (pk *PacketBuffer) Data() PacketData { return PacketData{pk: pk} } // AsSlices returns the underlying storage of the whole packet. -func (pk PacketBufferPtr) AsSlices() [][]byte { +func (pk *PacketBuffer) AsSlices() [][]byte { var views [][]byte offset := pk.headerOffset() pk.buf.SubApply(offset, int(pk.buf.Size())-offset, func(v *buffer.View) { @@ -290,7 +287,7 @@ func (pk PacketBufferPtr) AsSlices() [][]byte { // ToBuffer returns a caller-owned copy of the underlying storage of the whole // packet. -func (pk PacketBufferPtr) ToBuffer() buffer.Buffer { +func (pk *PacketBuffer) ToBuffer() buffer.Buffer { b := pk.buf.Clone() b.TrimFront(int64(pk.headerOffset())) return b @@ -298,7 +295,7 @@ func (pk PacketBufferPtr) ToBuffer() buffer.Buffer { // ToView returns a caller-owned copy of the underlying storage of the whole // packet as a view. -func (pk PacketBufferPtr) ToView() *buffer.View { +func (pk *PacketBuffer) ToView() *buffer.View { p := buffer.NewView(int(pk.buf.Size())) offset := pk.headerOffset() pk.buf.SubApply(offset, int(pk.buf.Size())-offset, func(v *buffer.View) { @@ -307,19 +304,19 @@ func (pk PacketBufferPtr) ToView() *buffer.View { return p } -func (pk PacketBufferPtr) headerOffset() int { +func (pk *PacketBuffer) headerOffset() int { return pk.reserved - pk.pushed } -func (pk PacketBufferPtr) headerOffsetOf(typ headerType) int { +func (pk *PacketBuffer) headerOffsetOf(typ headerType) int { return pk.reserved + pk.headers[typ].offset } -func (pk PacketBufferPtr) dataOffset() int { +func (pk *PacketBuffer) dataOffset() int { return pk.reserved + pk.consumed } -func (pk PacketBufferPtr) push(typ headerType, size int) []byte { +func (pk *PacketBuffer) push(typ headerType, size int) []byte { h := &pk.headers[typ] if h.length > 0 { panic(fmt.Sprintf("push(%s, %d) called after previous push", typ, size)) @@ -334,7 +331,7 @@ func (pk PacketBufferPtr) push(typ headerType, size int) []byte { return view.AsSlice() } -func (pk PacketBufferPtr) consume(typ headerType, size int) (v []byte, consumed bool) { +func (pk *PacketBuffer) consume(typ headerType, size int) (v []byte, consumed bool) { h := &pk.headers[typ] if h.length > 0 { panic(fmt.Sprintf("consume must not be called twice: type %s", typ)) @@ -349,7 +346,7 @@ func (pk PacketBufferPtr) consume(typ headerType, size int) (v []byte, consumed return view.AsSlice(), true } -func (pk PacketBufferPtr) headerView(typ headerType) buffer.View { +func (pk *PacketBuffer) headerView(typ headerType) buffer.View { h := &pk.headers[typ] if h.length == 0 { return buffer.View{} @@ -363,7 +360,7 @@ func (pk PacketBufferPtr) headerView(typ headerType) buffer.View { // Clone makes a semi-deep copy of pk. The underlying packet payload is // shared. Hence, no modifications is done to underlying packet payload. -func (pk PacketBufferPtr) Clone() PacketBufferPtr { +func (pk *PacketBuffer) Clone() *PacketBuffer { newPk := pkPool.Get().(*PacketBuffer) newPk.reset() newPk.buf = pk.buf.Clone() @@ -389,7 +386,7 @@ func (pk PacketBufferPtr) Clone() PacketBufferPtr { // ReserveHeaderBytes prepends reserved space for headers at the front // of the underlying buf. Can only be called once per packet. -func (pk PacketBufferPtr) ReserveHeaderBytes(reserved int) { +func (pk *PacketBuffer) ReserveHeaderBytes(reserved int) { if pk.reserved != 0 { panic(fmt.Sprintf("ReserveHeaderBytes(...) called on packet with reserved=%d, want reserved=0", pk.reserved)) } @@ -400,7 +397,7 @@ func (pk PacketBufferPtr) ReserveHeaderBytes(reserved int) { // Network returns the network header as a header.Network. // // Network should only be called when NetworkHeader has been set. -func (pk PacketBufferPtr) Network() header.Network { +func (pk *PacketBuffer) Network() header.Network { switch netProto := pk.NetworkProtocolNumber; netProto { case header.IPv4ProtocolNumber: return header.IPv4(pk.NetworkHeader().Slice()) @@ -416,7 +413,7 @@ func (pk PacketBufferPtr) Network() header.Network { // // See PacketBuffer.Data for details about how a packet buffer holds an inbound // packet. -func (pk PacketBufferPtr) CloneToInbound() PacketBufferPtr { +func (pk *PacketBuffer) CloneToInbound() *PacketBuffer { newPk := pkPool.Get().(*PacketBuffer) newPk.reset() newPk.buf = pk.buf.Clone() @@ -432,7 +429,7 @@ func (pk PacketBufferPtr) CloneToInbound() PacketBufferPtr { // // The returned packet buffer will have the network and transport headers // set if the original packet buffer did. -func (pk PacketBufferPtr) DeepCopyForForwarding(reservedHeaderBytes int) PacketBufferPtr { +func (pk *PacketBuffer) DeepCopyForForwarding(reservedHeaderBytes int) *PacketBuffer { payload := BufferSince(pk.NetworkHeader()) defer payload.Release() newPk := NewPacketBuffer(PacketBufferOptions{ @@ -463,7 +460,7 @@ func (pk PacketBufferPtr) DeepCopyForForwarding(reservedHeaderBytes int) PacketB } // IsNil returns whether the pointer is logically nil. -func (pk PacketBufferPtr) IsNil() bool { +func (pk *PacketBuffer) IsNil() bool { return pk == nil } @@ -481,7 +478,7 @@ type headerInfo struct { // PacketHeader is a handle object to a header in the underlying packet. type PacketHeader struct { - pk PacketBufferPtr + pk *PacketBuffer typ headerType } @@ -523,7 +520,7 @@ func (h PacketHeader) Consume(size int) (v []byte, consumed bool) { // // +stateify savable type PacketData struct { - pk PacketBufferPtr + pk *PacketBuffer } // PullUp returns a contiguous slice of size bytes from the beginning of d. @@ -601,7 +598,7 @@ func (d PacketData) MergeBuffer(b *buffer.Buffer) { // MergeFragment appends the data portion of frag to dst. It modifies // frag and frag should not be used again. -func MergeFragment(dst, frag PacketBufferPtr) { +func MergeFragment(dst, frag *PacketBuffer) { frag.buf.TrimFront(int64(frag.dataOffset())) dst.buf.Merge(&frag.buf) } @@ -674,7 +671,7 @@ func (d PacketData) ChecksumAtOffset(offset int) uint16 { // Range represents a contiguous subportion of a PacketBuffer. type Range struct { - pk PacketBufferPtr + pk *PacketBuffer offset int length int } diff --git a/pkg/tcpip/stack/packet_buffer_test.go b/pkg/tcpip/stack/packet_buffer_test.go index 7d5f73174..eb54c34af 100644 --- a/pkg/tcpip/stack/packet_buffer_test.go +++ b/pkg/tcpip/stack/packet_buffer_test.go @@ -393,12 +393,12 @@ func TestPacketHeaderConsumeThenPushPanics(t *testing.T) { func TestPacketBufferData(t *testing.T) { for _, tc := range []struct { name string - makePkt func(*testing.T) PacketBufferPtr + makePkt func(*testing.T) *PacketBuffer data string }{ { name: "inbound packet", - makePkt: func(*testing.T) PacketBufferPtr { + makePkt: func(*testing.T) *PacketBuffer { pkt := NewPacketBuffer(PacketBufferOptions{ Payload: buf("aabbbbccccccDATA"), }) @@ -411,7 +411,7 @@ func TestPacketBufferData(t *testing.T) { }, { name: "outbound packet", - makePkt: func(*testing.T) PacketBufferPtr { + makePkt: func(*testing.T) *PacketBuffer { pkt := NewPacketBuffer(PacketBufferOptions{ ReserveHeaderBytes: 12, Payload: buf("DATA"), @@ -580,7 +580,7 @@ type packetContents struct { data []byte } -func checkPacketContents(t *testing.T, prefix string, pk PacketBufferPtr, want packetContents) { +func checkPacketContents(t *testing.T, prefix string, pk *PacketBuffer, want packetContents) { t.Helper() // Headers. checkPacketHeader(t, prefix+"pk.LinkHeader", pk.LinkHeader(), want.link) @@ -620,7 +620,7 @@ func checkPacketContents(t *testing.T, prefix string, pk PacketBufferPtr, want p concatViews(want.transport, want.data)) } -func checkInitialPacketBuffer(t *testing.T, pk PacketBufferPtr, opts PacketBufferOptions) { +func checkInitialPacketBuffer(t *testing.T, pk *PacketBuffer, opts PacketBufferOptions) { t.Helper() reserved := opts.ReserveHeaderBytes if got, want := pk.ReservedHeaderBytes(), reserved; got != want { @@ -653,7 +653,7 @@ func checkViewEqual(t *testing.T, what string, got, want []byte) { } } -func checkData(t *testing.T, pkt PacketBufferPtr, want []byte) { +func checkData(t *testing.T, pkt *PacketBuffer, want []byte) { t.Helper() if got := pkt.Data().AsRange().ToSlice(); !bytes.Equal(got, want) { t.Errorf("pkt.Data().Slices() = 0x%x, want 0x%x", got, want) diff --git a/pkg/tcpip/stack/packet_buffer_unsafe.go b/pkg/tcpip/stack/packet_buffer_unsafe.go index ddfb80045..9d1105b29 100644 --- a/pkg/tcpip/stack/packet_buffer_unsafe.go +++ b/pkg/tcpip/stack/packet_buffer_unsafe.go @@ -21,8 +21,8 @@ const PacketBufferStructSize = int(unsafe.Sizeof(PacketBuffer{})) // ID returns a unique ID for the underlying storage of the packet. // -// Two PacketBufferPtrs have the same IDs if and only if they point to the same +// Two *PacketBuffers have the same IDs if and only if they point to the same // location in memory. -func (pk PacketBufferPtr) ID() uintptr { +func (pk *PacketBuffer) ID() uintptr { return uintptr(unsafe.Pointer(pk)) } diff --git a/pkg/tcpip/stack/pending_packets.go b/pkg/tcpip/stack/pending_packets.go index 0627fb812..a7452f891 100644 --- a/pkg/tcpip/stack/pending_packets.go +++ b/pkg/tcpip/stack/pending_packets.go @@ -29,7 +29,7 @@ const ( type pendingPacket struct { routeInfo RouteInfo - pkt PacketBufferPtr + pkt *PacketBuffer } // packetsPendingLinkResolution is a queue of packets pending link resolution. @@ -54,7 +54,7 @@ type packetsPendingLinkResolution struct { } } -func (f *packetsPendingLinkResolution) incrementOutgoingPacketErrors(pkt PacketBufferPtr) { +func (f *packetsPendingLinkResolution) incrementOutgoingPacketErrors(pkt *PacketBuffer) { f.nic.stack.stats.IP.OutgoingPacketErrors.Increment() if ipEndpointStats, ok := f.nic.getNetworkEndpoint(pkt.NetworkProtocolNumber).Stats().(IPNetworkEndpointStats); ok { @@ -113,7 +113,7 @@ func (f *packetsPendingLinkResolution) dequeue(ch <-chan struct{}, linkAddr tcpi // If the maximum number of pending resolutions is reached, the packets // associated with the oldest link resolution will be dequeued as if they failed // link resolution. -func (f *packetsPendingLinkResolution) enqueue(r *Route, pkt PacketBufferPtr) tcpip.Error { +func (f *packetsPendingLinkResolution) enqueue(r *Route, pkt *PacketBuffer) tcpip.Error { f.mu.Lock() // Make sure we attempt resolution while holding f's lock so that we avoid // a race where link resolution completes before we enqueue the packets. diff --git a/pkg/tcpip/stack/registration.go b/pkg/tcpip/stack/registration.go index d9950928c..eb829b718 100644 --- a/pkg/tcpip/stack/registration.go +++ b/pkg/tcpip/stack/registration.go @@ -120,12 +120,12 @@ type TransportEndpoint interface { // transport endpoint. It sets the packet buffer's transport header. // // HandlePacket may modify the packet. - HandlePacket(TransportEndpointID, PacketBufferPtr) + HandlePacket(TransportEndpointID, *PacketBuffer) // HandleError is called when the transport endpoint receives an error. // // HandleError takes may modify the packet buffer. - HandleError(TransportError, PacketBufferPtr) + HandleError(TransportError, *PacketBuffer) // Abort initiates an expedited endpoint teardown. It puts the endpoint // in a closed state and frees all resources associated with it. This @@ -153,7 +153,7 @@ type RawTransportEndpoint interface { // layer up. // // HandlePacket may modify the packet. - HandlePacket(PacketBufferPtr) + HandlePacket(*PacketBuffer) } // PacketEndpoint is the interface that needs to be implemented by packet @@ -171,7 +171,7 @@ type PacketEndpoint interface { // should construct its own ethernet header for applications. // // HandlePacket may modify pkt. - HandlePacket(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) + HandlePacket(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, pkt *PacketBuffer) } // UnknownDestinationPacketDisposition enumerates the possible return values from @@ -221,7 +221,7 @@ type TransportProtocol interface { // // HandleUnknownDestinationPacket may modify the packet if it handles // the issue. - HandleUnknownDestinationPacket(TransportEndpointID, PacketBufferPtr) UnknownDestinationPacketDisposition + HandleUnknownDestinationPacket(TransportEndpointID, *PacketBuffer) UnknownDestinationPacketDisposition // SetOption allows enabling/disabling protocol specific features. // SetOption returns an error if the option is not supported or the @@ -250,7 +250,7 @@ type TransportProtocol interface { // Parse sets pkt.TransportHeader and trims pkt.Data appropriately. It does // neither and returns false if pkt.Data is too small, i.e. pkt.Data.Size() < // MinimumPacketSize() - Parse(pkt PacketBufferPtr) (ok bool) + Parse(pkt *PacketBuffer) (ok bool) } // TransportPacketDisposition is the result from attempting to deliver a packet @@ -282,18 +282,18 @@ type TransportDispatcher interface { // pkt.NetworkHeader must be set before calling DeliverTransportPacket. // // DeliverTransportPacket may modify the packet. - DeliverTransportPacket(tcpip.TransportProtocolNumber, PacketBufferPtr) TransportPacketDisposition + DeliverTransportPacket(tcpip.TransportProtocolNumber, *PacketBuffer) TransportPacketDisposition // DeliverTransportError delivers an error to the appropriate transport // endpoint. // // DeliverTransportError may modify the packet buffer. - DeliverTransportError(local, remote tcpip.Address, _ tcpip.NetworkProtocolNumber, _ tcpip.TransportProtocolNumber, _ TransportError, _ PacketBufferPtr) + DeliverTransportError(local, remote tcpip.Address, _ tcpip.NetworkProtocolNumber, _ tcpip.TransportProtocolNumber, _ TransportError, _ *PacketBuffer) // DeliverRawPacket delivers a packet to any subscribed raw sockets. // // DeliverRawPacket does NOT take ownership of the packet buffer. - DeliverRawPacket(tcpip.TransportProtocolNumber, PacketBufferPtr) + DeliverRawPacket(tcpip.TransportProtocolNumber, *PacketBuffer) } // PacketLooping specifies where an outbound packet should be sent. @@ -740,13 +740,13 @@ type NetworkInterface interface { CheckLocalAddress(tcpip.NetworkProtocolNumber, tcpip.Address) bool // WritePacketToRemote writes the packet to the given remote link address. - WritePacketToRemote(tcpip.LinkAddress, PacketBufferPtr) tcpip.Error + WritePacketToRemote(tcpip.LinkAddress, *PacketBuffer) tcpip.Error // WritePacket writes a packet through the given route. // // WritePacket may modify the packet buffer. The packet buffer's // network and transport header must be set. - WritePacket(*Route, PacketBufferPtr) tcpip.Error + WritePacket(*Route, *PacketBuffer) tcpip.Error // HandleNeighborProbe processes an incoming neighbor probe (e.g. ARP // request or NDP Neighbor Solicitation). @@ -764,7 +764,7 @@ type NetworkInterface interface { type LinkResolvableNetworkEndpoint interface { // HandleLinkResolutionFailure is called when link resolution prevents the // argument from having been sent. - HandleLinkResolutionFailure(PacketBufferPtr) + HandleLinkResolutionFailure(*PacketBuffer) } // NetworkEndpoint is the interface that needs to be implemented by endpoints @@ -802,17 +802,17 @@ type NetworkEndpoint interface { // WritePacket writes a packet to the given destination address and // protocol. It may modify pkt. pkt.TransportHeader must have // already been set. - WritePacket(r *Route, params NetworkHeaderParams, pkt PacketBufferPtr) tcpip.Error + WritePacket(r *Route, params NetworkHeaderParams, pkt *PacketBuffer) tcpip.Error // WriteHeaderIncludedPacket writes a packet that includes a network // header to the given destination address. It may modify pkt. - WriteHeaderIncludedPacket(r *Route, pkt PacketBufferPtr) tcpip.Error + WriteHeaderIncludedPacket(r *Route, pkt *PacketBuffer) tcpip.Error // HandlePacket is called by the link layer when new packets arrive to // this network endpoint. It sets pkt.NetworkHeader. // // HandlePacket may modify pkt. - HandlePacket(pkt PacketBufferPtr) + HandlePacket(pkt *PacketBuffer) // Close is called when the endpoint is removed from a stack. Close() @@ -911,7 +911,7 @@ type NetworkProtocol interface { // - Whether there is an encapsulated transport protocol payload (e.g. ARP // does not encapsulate anything). // - Whether pkt.Data was large enough to parse and set pkt.NetworkHeader. - Parse(pkt PacketBufferPtr) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) + Parse(pkt *PacketBuffer) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) } // UnicastSourceAndMulticastDestination is a tuple that represents a unicast @@ -1027,14 +1027,14 @@ type NetworkDispatcher interface { // If the link-layer has a header, the packet's link header must be populated. // // DeliverNetworkPacket may modify pkt. - DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) + DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) // DeliverLinkPacket delivers a packet to any interested packet endpoints. // // This method should be called with both incoming and outgoing packets. // // If the link-layer has a header, the packet's link header must be populated. - DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) + DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) } // LinkEndpointCapabilities is the type associated with the capabilities @@ -1123,10 +1123,10 @@ type NetworkLinkEndpoint interface { ARPHardwareType() header.ARPHardwareType // AddHeader adds a link layer header to the packet if required. - AddHeader(PacketBufferPtr) + AddHeader(*PacketBuffer) // ParseHeader parses the link layer header to the packet. - ParseHeader(PacketBufferPtr) bool + ParseHeader(*PacketBuffer) bool } // QueueingDiscipline provides a queueing strategy for outgoing packets (e.g @@ -1140,7 +1140,7 @@ type QueueingDiscipline interface { // To participate in transparent bridging, a LinkEndpoint implementation // should call eth.Encode with header.EthernetFields.SrcAddr set to // pkg.EgressRoute.LocalLinkAddress if it is provided. - WritePacket(PacketBufferPtr) tcpip.Error + WritePacket(*PacketBuffer) tcpip.Error Close() } @@ -1161,7 +1161,7 @@ type InjectableLinkEndpoint interface { LinkEndpoint // InjectInbound injects an inbound packet. - InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) + InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) // InjectOutbound writes a fully formed outbound packet directly to the // link. diff --git a/pkg/tcpip/stack/route.go b/pkg/tcpip/stack/route.go index 4b0f52e55..e386ded72 100644 --- a/pkg/tcpip/stack/route.go +++ b/pkg/tcpip/stack/route.go @@ -492,7 +492,7 @@ func (r *Route) isValidForOutgoingRLocked() bool { } // WritePacket writes the packet through the given route. -func (r *Route) WritePacket(params NetworkHeaderParams, pkt PacketBufferPtr) tcpip.Error { +func (r *Route) WritePacket(params NetworkHeaderParams, pkt *PacketBuffer) tcpip.Error { if !r.isValidForOutgoing() { return &tcpip.ErrInvalidEndpointState{} } @@ -502,7 +502,7 @@ func (r *Route) WritePacket(params NetworkHeaderParams, pkt PacketBufferPtr) tcp // WriteHeaderIncludedPacket writes a packet already containing a network // header through the given route. -func (r *Route) WriteHeaderIncludedPacket(pkt PacketBufferPtr) tcpip.Error { +func (r *Route) WriteHeaderIncludedPacket(pkt *PacketBuffer) tcpip.Error { if !r.isValidForOutgoing() { return &tcpip.ErrInvalidEndpointState{} } diff --git a/pkg/tcpip/stack/stack.go b/pkg/tcpip/stack/stack.go index c2c5a2240..45a1c3633 100644 --- a/pkg/tcpip/stack/stack.go +++ b/pkg/tcpip/stack/stack.go @@ -45,7 +45,7 @@ const ( type transportProtocolState struct { proto TransportProtocol - defaultHandler func(id TransportEndpointID, pkt PacketBufferPtr) bool + defaultHandler func(id TransportEndpointID, pkt *PacketBuffer) bool } // ResumableEndpoint is an endpoint that needs to be resumed after restore. @@ -490,7 +490,7 @@ func (s *Stack) TransportProtocolOption(transport tcpip.TransportProtocolNumber, // // It must be called only during initialization of the stack. Changing it as the // stack is operating is not supported. -func (s *Stack) SetTransportProtocolHandler(p tcpip.TransportProtocolNumber, h func(TransportEndpointID, PacketBufferPtr) bool) { +func (s *Stack) SetTransportProtocolHandler(p tcpip.TransportProtocolNumber, h func(TransportEndpointID, *PacketBuffer) bool) { state := s.transportProtocols[p] if state != nil { state.defaultHandler = h @@ -2136,7 +2136,7 @@ const ( // ParsePacketBufferTransport parses the provided packet buffer's transport // header. -func (s *Stack) ParsePacketBufferTransport(protocol tcpip.TransportProtocolNumber, pkt PacketBufferPtr) ParseResult { +func (s *Stack) ParsePacketBufferTransport(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer) ParseResult { pkt.TransportProtocolNumber = protocol // Parse the transport header if present. state, ok := s.transportProtocols[protocol] diff --git a/pkg/tcpip/stack/stack_test.go b/pkg/tcpip/stack/stack_test.go index 8ebcbb930..be6142589 100644 --- a/pkg/tcpip/stack/stack_test.go +++ b/pkg/tcpip/stack/stack_test.go @@ -121,7 +121,7 @@ func (*fakeNetworkEndpoint) DefaultTTL() uint8 { return 123 } -func (f *fakeNetworkEndpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (f *fakeNetworkEndpoint) HandlePacket(pkt *stack.PacketBuffer) { if _, _, ok := f.proto.Parse(pkt); !ok { return } @@ -178,7 +178,7 @@ func (f *fakeNetworkEndpoint) NetworkProtocolNumber() tcpip.NetworkProtocolNumbe return f.proto.Number() } -func (f *fakeNetworkEndpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt stack.PacketBufferPtr) tcpip.Error { +func (f *fakeNetworkEndpoint) WritePacket(r *stack.Route, params stack.NetworkHeaderParams, pkt *stack.PacketBuffer) tcpip.Error { // Increment the sent packet count in the protocol descriptor. remote := r.RemoteAddress() f.proto.sendPacketCount[int(remote.AsSlice()[0])%len(f.proto.sendPacketCount)]++ @@ -207,7 +207,7 @@ func (*fakeNetworkEndpoint) WritePackets(*stack.Route, stack.PacketBufferList, s panic("not implemented") } -func (*fakeNetworkEndpoint) WriteHeaderIncludedPacket(*stack.Route, stack.PacketBufferPtr) tcpip.Error { +func (*fakeNetworkEndpoint) WriteHeaderIncludedPacket(*stack.Route, *stack.PacketBuffer) tcpip.Error { return &tcpip.ErrNotSupported{} } @@ -308,7 +308,7 @@ func (*fakeNetworkProtocol) Close() {} func (*fakeNetworkProtocol) Wait() {} // Parse implements NetworkProtocol.Parse. -func (*fakeNetworkProtocol) Parse(pkt stack.PacketBufferPtr) (tcpip.TransportProtocolNumber, bool, bool) { +func (*fakeNetworkProtocol) Parse(pkt *stack.PacketBuffer) (tcpip.TransportProtocolNumber, bool, bool) { hdr, ok := pkt.NetworkHeader().Consume(fakeNetHeaderLen) if !ok { return 0, false, false diff --git a/pkg/tcpip/stack/transport_demuxer.go b/pkg/tcpip/stack/transport_demuxer.go index 6d38b637e..089f214b0 100644 --- a/pkg/tcpip/stack/transport_demuxer.go +++ b/pkg/tcpip/stack/transport_demuxer.go @@ -155,7 +155,7 @@ func (epsByNIC *endpointsByNIC) transportEndpoints() []TransportEndpoint { // handlePacket is called by the stack when new packets arrive to this transport // endpoint. It returns false if the packet could not be matched to any // transport endpoint, true otherwise. -func (epsByNIC *endpointsByNIC) handlePacket(id TransportEndpointID, pkt PacketBufferPtr) bool { +func (epsByNIC *endpointsByNIC) handlePacket(id TransportEndpointID, pkt *PacketBuffer) bool { epsByNIC.mu.RLock() mpep, ok := epsByNIC.endpoints[pkt.NICID] @@ -187,7 +187,7 @@ func (epsByNIC *endpointsByNIC) handlePacket(id TransportEndpointID, pkt PacketB } // handleError delivers an error to the transport endpoint identified by id. -func (epsByNIC *endpointsByNIC) handleError(n *nic, id TransportEndpointID, transErr TransportError, pkt PacketBufferPtr) { +func (epsByNIC *endpointsByNIC) handleError(n *nic, id TransportEndpointID, transErr TransportError, pkt *PacketBuffer) { epsByNIC.mu.RLock() mpep, ok := epsByNIC.endpoints[n.ID()] @@ -278,7 +278,7 @@ type transportDemuxer struct { // the dispatcher to delivery packets to the QueuePacket method instead of // calling HandlePacket directly on the endpoint. type queuedTransportProtocol interface { - QueuePacket(ep TransportEndpoint, id TransportEndpointID, pkt PacketBufferPtr) + QueuePacket(ep TransportEndpoint, id TransportEndpointID, pkt *PacketBuffer) } func newTransportDemuxer(stack *Stack) *transportDemuxer { @@ -400,7 +400,7 @@ func (ep *multiPortEndpoint) selectEndpoint(id TransportEndpointID, seed uint32) return ep.endpoints[idx] } -func (ep *multiPortEndpoint) handlePacketAll(id TransportEndpointID, pkt PacketBufferPtr) { +func (ep *multiPortEndpoint) handlePacketAll(id TransportEndpointID, pkt *PacketBuffer) { ep.mu.RLock() queuedProtocol, mustQueue := ep.demux.queuedProtocols[protocolIDs{ep.netProto, ep.transProto}] // HandlePacket may modify pkt, so each endpoint needs @@ -546,7 +546,7 @@ func (d *transportDemuxer) unregisterEndpoint(netProtos []tcpip.NetworkProtocolN // deliverPacket attempts to find one or more matching transport endpoints, and // then, if matches are found, delivers the packet to them. Returns true if // the packet no longer needs to be handled. -func (d *transportDemuxer) deliverPacket(protocol tcpip.TransportProtocolNumber, pkt PacketBufferPtr, id TransportEndpointID) bool { +func (d *transportDemuxer) deliverPacket(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer, id TransportEndpointID) bool { eps, ok := d.protocol[protocolIDs{pkt.NetworkProtocolNumber, protocol}] if !ok { return false @@ -599,7 +599,7 @@ func (d *transportDemuxer) deliverPacket(protocol tcpip.TransportProtocolNumber, // deliverRawPacket attempts to deliver the given packet and returns whether it // was delivered successfully. -func (d *transportDemuxer) deliverRawPacket(protocol tcpip.TransportProtocolNumber, pkt PacketBufferPtr) bool { +func (d *transportDemuxer) deliverRawPacket(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer) bool { eps, ok := d.protocol[protocolIDs{pkt.NetworkProtocolNumber, protocol}] if !ok { return false @@ -633,7 +633,7 @@ func (d *transportDemuxer) deliverRawPacket(protocol tcpip.TransportProtocolNumb // endpoint. // // Returns true if the error was delivered. -func (d *transportDemuxer) deliverError(n *nic, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr TransportError, pkt PacketBufferPtr, id TransportEndpointID) bool { +func (d *transportDemuxer) deliverError(n *nic, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, transErr TransportError, pkt *PacketBuffer, id TransportEndpointID) bool { eps, ok := d.protocol[protocolIDs{net, trans}] if !ok { return false @@ -718,7 +718,7 @@ func (d *transportDemuxer) unregisterRawEndpoint(netProto tcpip.NetworkProtocolN eps.mu.Unlock() } -func isInboundMulticastOrBroadcast(pkt PacketBufferPtr, localAddr tcpip.Address) bool { +func isInboundMulticastOrBroadcast(pkt *PacketBuffer, localAddr tcpip.Address) bool { return pkt.NetworkPacketInfo.LocalAddressBroadcast || header.IsV4MulticastAddress(localAddr) || header.IsV6MulticastAddress(localAddr) } diff --git a/pkg/tcpip/stack/transport_test.go b/pkg/tcpip/stack/transport_test.go index 0da3af882..43b617d32 100644 --- a/pkg/tcpip/stack/transport_test.go +++ b/pkg/tcpip/stack/transport_test.go @@ -213,7 +213,7 @@ func (*fakeTransportEndpoint) GetRemoteAddress() (tcpip.FullAddress, tcpip.Error return tcpip.FullAddress{}, nil } -func (f *fakeTransportEndpoint) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) { +func (f *fakeTransportEndpoint) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) { // Increment the number of received packets. f.proto.packetCount++ if f.acceptQueue == nil { @@ -244,7 +244,7 @@ func (f *fakeTransportEndpoint) HandlePacket(id stack.TransportEndpointID, pkt s f.acceptQueue = append(f.acceptQueue, ep) } -func (f *fakeTransportEndpoint) HandleError(stack.TransportError, stack.PacketBufferPtr) { +func (f *fakeTransportEndpoint) HandleError(stack.TransportError, *stack.PacketBuffer) { // Increment the number of received control packets. f.proto.controlCount++ } @@ -303,7 +303,7 @@ func (*fakeTransportProtocol) ParsePorts([]byte) (src, dst uint16, err tcpip.Err return 0, 0, nil } -func (*fakeTransportProtocol) HandleUnknownDestinationPacket(stack.TransportEndpointID, stack.PacketBufferPtr) stack.UnknownDestinationPacketDisposition { +func (*fakeTransportProtocol) HandleUnknownDestinationPacket(stack.TransportEndpointID, *stack.PacketBuffer) stack.UnknownDestinationPacketDisposition { return stack.UnknownDestinationPacketHandled } @@ -343,7 +343,7 @@ func (*fakeTransportProtocol) Pause() {} func (*fakeTransportProtocol) Resume() {} // Parse implements TransportProtocol.Parse. -func (*fakeTransportProtocol) Parse(pkt stack.PacketBufferPtr) bool { +func (*fakeTransportProtocol) Parse(pkt *stack.PacketBuffer) bool { if _, ok := pkt.TransportHeader().Consume(fakeTransHeaderLen); ok { pkt.TransportProtocolNumber = fakeTransNumber return true diff --git a/pkg/tcpip/tests/integration/iptables_test.go b/pkg/tcpip/tests/integration/iptables_test.go index 497449e8d..26a2047f6 100644 --- a/pkg/tcpip/tests/integration/iptables_test.go +++ b/pkg/tcpip/tests/integration/iptables_test.go @@ -51,7 +51,7 @@ func (*inputIfNameMatcher) Name() string { return "inputIfNameMatcher" } -func (im *inputIfNameMatcher) Match(hook stack.Hook, _ stack.PacketBufferPtr, inNicName, _ string) (bool, bool) { +func (im *inputIfNameMatcher) Match(hook stack.Hook, _ *stack.PacketBuffer, inNicName, _ string) (bool, bool) { return (hook == stack.Input && im.name != "" && im.name == inNicName), false } @@ -112,7 +112,7 @@ func genStackV4(t *testing.T) (*stack.Stack, *channel.Endpoint) { return s, e } -func genPacketV6() stack.PacketBufferPtr { +func genPacketV6() *stack.PacketBuffer { pktSize := header.IPv6MinimumSize + payloadSize hdr := prependable.New(pktSize) ip := header.IPv6(hdr.Prepend(pktSize)) @@ -127,7 +127,7 @@ func genPacketV6() stack.PacketBufferPtr { return stack.NewPacketBuffer(stack.PacketBufferOptions{Payload: buf}) } -func genPacketV4() stack.PacketBufferPtr { +func genPacketV4() *stack.PacketBuffer { pktSize := header.IPv4MinimumSize + payloadSize hdr := prependable.New(pktSize) ip := header.IPv4(hdr.Prepend(pktSize)) @@ -153,7 +153,7 @@ func TestIPTablesStatsForInput(t *testing.T) { name string setupStack func(*testing.T) (*stack.Stack, *channel.Endpoint) setupFilter func(*testing.T, *stack.Stack) - genPacket func() stack.PacketBufferPtr + genPacket func() *stack.PacketBuffer proto tcpip.NetworkProtocolNumber expectReceived int expectInputDropped int @@ -366,7 +366,7 @@ func (*udpSourcePortMatcher) Name() string { return "udpSourcePortMatcher" } -func (m *udpSourcePortMatcher) Match(_ stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (matches, hotdrop bool) { +func (m *udpSourcePortMatcher) Match(_ stack.Hook, pkt *stack.PacketBuffer, _, _ string) (matches, hotdrop bool) { udp := header.UDP(pkt.TransportHeader().Slice()) if len(udp) < header.UDPMinimumSize { // Drop immediately as the packet is invalid. @@ -3049,7 +3049,7 @@ type icmpv4Matcher struct { icmpType header.ICMPv4Type } -func (m *icmpv4Matcher) Match(_ stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (matches bool, hotdrop bool) { +func (m *icmpv4Matcher) Match(_ stack.Hook, pkt *stack.PacketBuffer, _, _ string) (matches bool, hotdrop bool) { if pkt.NetworkProtocolNumber != header.IPv4ProtocolNumber { return false, false } @@ -3065,7 +3065,7 @@ type icmpv6Matcher struct { icmpType header.ICMPv6Type } -func (m *icmpv6Matcher) Match(_ stack.Hook, pkt stack.PacketBufferPtr, _, _ string) (matches bool, hotdrop bool) { +func (m *icmpv6Matcher) Match(_ stack.Hook, pkt *stack.PacketBuffer, _, _ string) (matches bool, hotdrop bool) { if pkt.NetworkProtocolNumber != header.IPv6ProtocolNumber { return false, false } @@ -3345,7 +3345,7 @@ func TestInvalidTransportHeader(t *testing.T) { tests := []struct { name string setupStack func(*testing.T) (*stack.Stack, *channel.Endpoint) - genPacket func(int8) stack.PacketBufferPtr + genPacket func(int8) *stack.PacketBuffer offset int8 }{ { @@ -3413,7 +3413,7 @@ func TestInvalidTransportHeader(t *testing.T) { } } -func genTCP4(offset int8) stack.PacketBufferPtr { +func genTCP4(offset int8) *stack.PacketBuffer { pktSize := header.IPv4MinimumSize + header.TCPMinimumSize hdr := prependable.New(pktSize) @@ -3445,7 +3445,7 @@ func genTCP4(offset int8) stack.PacketBufferPtr { return stack.NewPacketBuffer(stack.PacketBufferOptions{Payload: buf}) } -func genTCP6(offset int8) stack.PacketBufferPtr { +func genTCP6(offset int8) *stack.PacketBuffer { pktSize := header.IPv6MinimumSize + header.TCPMinimumSize hdr := prependable.New(pktSize) @@ -3471,7 +3471,7 @@ func genTCP6(offset int8) stack.PacketBufferPtr { return stack.NewPacketBuffer(stack.PacketBufferOptions{Payload: buf}) } -func genUDP4(offset int8) stack.PacketBufferPtr { +func genUDP4(offset int8) *stack.PacketBuffer { pktSize := header.IPv4MinimumSize + header.UDPMinimumSize hdr := prependable.New(pktSize) @@ -3502,7 +3502,7 @@ func genUDP4(offset int8) stack.PacketBufferPtr { return stack.NewPacketBuffer(stack.PacketBufferOptions{Payload: buf}) } -func genUDP6(offset int8) stack.PacketBufferPtr { +func genUDP6(offset int8) *stack.PacketBuffer { pktSize := header.IPv6MinimumSize + header.UDPMinimumSize hdr := prependable.New(pktSize) diff --git a/pkg/tcpip/tests/integration/link_resolution_test.go b/pkg/tcpip/tests/integration/link_resolution_test.go index 7a120b90a..782bf63ff 100644 --- a/pkg/tcpip/tests/integration/link_resolution_test.go +++ b/pkg/tcpip/tests/integration/link_resolution_test.go @@ -443,7 +443,7 @@ func TestForwardingWithLinkResolutionFailure(t *testing.T) { utils.RxICMPv6EchoRequest(e, src, dst, ttl) } - arpChecker := func(t *testing.T, request stack.PacketBufferPtr, src, dst tcpip.Address) { + arpChecker := func(t *testing.T, request *stack.PacketBuffer, src, dst tcpip.Address) { if request.NetworkProtocolNumber != arp.ProtocolNumber { t.Errorf("got request.NetworkProtocolNumber = %d, want = %d", request.NetworkProtocolNumber, arp.ProtocolNumber) } @@ -465,7 +465,7 @@ func TestForwardingWithLinkResolutionFailure(t *testing.T) { } } - ndpChecker := func(t *testing.T, request stack.PacketBufferPtr, src, dst tcpip.Address) { + ndpChecker := func(t *testing.T, request *stack.PacketBuffer, src, dst tcpip.Address) { if request.NetworkProtocolNumber != header.IPv6ProtocolNumber { t.Fatalf("got Proto = %d, want = %d", request.NetworkProtocolNumber, header.IPv6ProtocolNumber) } @@ -521,7 +521,7 @@ func TestForwardingWithLinkResolutionFailure(t *testing.T) { outgoingAddr tcpip.AddressWithPrefix transportProtocol func(*stack.Stack) stack.TransportProtocol rx func(*channel.Endpoint, tcpip.Address, tcpip.Address) - linkResolutionRequestChecker func(*testing.T, stack.PacketBufferPtr, tcpip.Address, tcpip.Address) + linkResolutionRequestChecker func(*testing.T, *stack.PacketBuffer, tcpip.Address, tcpip.Address) icmpReplyChecker func(*testing.T, *buffer.View, tcpip.Address, tcpip.Address) mtu uint32 }{ diff --git a/pkg/tcpip/tests/integration/multicast_forward_test.go b/pkg/tcpip/tests/integration/multicast_forward_test.go index cbe015a08..7671b69d9 100644 --- a/pkg/tcpip/tests/integration/multicast_forward_test.go +++ b/pkg/tcpip/tests/integration/multicast_forward_test.go @@ -164,7 +164,7 @@ func getEndpointAddr(protocol tcpip.NetworkProtocolNumber, addrType endpointAddr } } -func checkEchoRequest(t *testing.T, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr, srcAddr, dstAddr tcpip.Address, ttl uint8) { +func checkEchoRequest(t *testing.T, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer, srcAddr, dstAddr tcpip.Address, ttl uint8) { payload := stack.PayloadSince(pkt.NetworkHeader()) defer payload.Release() switch protocol { @@ -191,7 +191,7 @@ func checkEchoRequest(t *testing.T, protocol tcpip.NetworkProtocolNumber, pkt st } } -func checkEchoReply(t *testing.T, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr, srcAddr, dstAddr tcpip.Address) { +func checkEchoReply(t *testing.T, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer, srcAddr, dstAddr tcpip.Address) { payload := stack.PayloadSince(pkt.NetworkHeader()) defer payload.Release() switch protocol { diff --git a/pkg/tcpip/tests/utils/utils.go b/pkg/tcpip/tests/utils/utils.go index bbd38b5e3..07674f2e3 100644 --- a/pkg/tcpip/tests/utils/utils.go +++ b/pkg/tcpip/tests/utils/utils.go @@ -209,7 +209,7 @@ var _ stack.NetworkDispatcher = (*EndpointWithDestinationCheck)(nil) var _ stack.LinkEndpoint = (*EndpointWithDestinationCheck)(nil) // DeliverNetworkPacket implements stack.NetworkDispatcher. -func (e *EndpointWithDestinationCheck) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (e *EndpointWithDestinationCheck) DeliverNetworkPacket(proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { if dst := header.Ethernet(pkt.LinkHeader().Slice()).DestinationAddress(); dst == e.Endpoint.LinkAddress() || dst == header.EthernetBroadcastAddress || header.IsMulticastEthernetAddress(dst) { e.Endpoint.DeliverNetworkPacket(proto, pkt) } diff --git a/pkg/tcpip/transport/datagram_test.go b/pkg/tcpip/transport/datagram_test.go index 9879f2149..961f2364c 100644 --- a/pkg/tcpip/transport/datagram_test.go +++ b/pkg/tcpip/transport/datagram_test.go @@ -168,8 +168,8 @@ func (e *mockEndpoint) Attach(d stack.NetworkDispatcher) { e.disp = d } func (e *mockEndpoint) IsAttached() bool { return e.disp != nil } func (*mockEndpoint) Wait() {} func (*mockEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone } -func (*mockEndpoint) AddHeader(stack.PacketBufferPtr) {} -func (*mockEndpoint) ParseHeader(stack.PacketBufferPtr) bool { return true } +func (*mockEndpoint) AddHeader(*stack.PacketBuffer) {} +func (*mockEndpoint) ParseHeader(*stack.PacketBuffer) bool { return true } func (e *mockEndpoint) releasePackets() { e.pkts.DecRef() e.pkts = stack.PacketBufferList{} diff --git a/pkg/tcpip/transport/icmp/endpoint.go b/pkg/tcpip/transport/icmp/endpoint.go index d3e72e37b..5ea7791fc 100644 --- a/pkg/tcpip/transport/icmp/endpoint.go +++ b/pkg/tcpip/transport/icmp/endpoint.go @@ -36,7 +36,7 @@ type icmpPacket struct { icmpPacketEntry senderAddress tcpip.FullAddress packetInfo tcpip.IPPacketInfo - data stack.PacketBufferPtr + data *stack.PacketBuffer receivedAt time.Time `state:".(int64)"` // tosOrTClass stores either the Type of Service for IPv4 or the Traffic Class @@ -696,7 +696,7 @@ func (e *endpoint) Readiness(mask waiter.EventMask) waiter.EventMask { // HandlePacket is called by the stack when new packets arrive to this transport // endpoint. -func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) { // Only accept echo replies. switch e.net.NetProto() { case header.IPv4ProtocolNumber: @@ -784,7 +784,7 @@ func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBu } // HandleError implements stack.TransportEndpoint. -func (*endpoint) HandleError(stack.TransportError, stack.PacketBufferPtr) {} +func (*endpoint) HandleError(stack.TransportError, *stack.PacketBuffer) {} // State implements tcpip.Endpoint.State. The ICMP endpoint currently doesn't // expose internal socket state. diff --git a/pkg/tcpip/transport/icmp/protocol.go b/pkg/tcpip/transport/icmp/protocol.go index d9833e478..7e6e3db18 100644 --- a/pkg/tcpip/transport/icmp/protocol.go +++ b/pkg/tcpip/transport/icmp/protocol.go @@ -100,7 +100,7 @@ func (p *protocol) ParsePorts(v []byte) (src, dst uint16, err tcpip.Error) { // HandleUnknownDestinationPacket handles packets targeted at this protocol but // that don't match any existing endpoint. -func (*protocol) HandleUnknownDestinationPacket(stack.TransportEndpointID, stack.PacketBufferPtr) stack.UnknownDestinationPacketDisposition { +func (*protocol) HandleUnknownDestinationPacket(stack.TransportEndpointID, *stack.PacketBuffer) stack.UnknownDestinationPacketDisposition { return stack.UnknownDestinationPacketHandled } @@ -127,7 +127,7 @@ func (*protocol) Pause() {} func (*protocol) Resume() {} // Parse implements stack.TransportProtocol.Parse. -func (*protocol) Parse(pkt stack.PacketBufferPtr) bool { +func (*protocol) Parse(pkt *stack.PacketBuffer) bool { // Right now, the Parse() method is tied to enabled protocols passed into // stack.New. This works for UDP and TCP, but we handle ICMP traffic even // when netstack users don't pass ICMP as a supported protocol. diff --git a/pkg/tcpip/transport/internal/network/endpoint.go b/pkg/tcpip/transport/internal/network/endpoint.go index 5309f9159..9d61e881e 100644 --- a/pkg/tcpip/transport/internal/network/endpoint.go +++ b/pkg/tcpip/transport/internal/network/endpoint.go @@ -265,7 +265,7 @@ func (c *WriteContext) PacketInfo() WritePacketInfo { // // If this method returns nil, the caller should wait for the endpoint to become // writable. -func (c *WriteContext) TryNewPacketBuffer(reserveHdrBytes int, data buffer.Buffer) stack.PacketBufferPtr { +func (c *WriteContext) TryNewPacketBuffer(reserveHdrBytes int, data buffer.Buffer) *stack.PacketBuffer { e := c.e e.sendBufferSizeInUseMu.Lock() @@ -308,7 +308,7 @@ func (c *WriteContext) TryNewPacketBuffer(reserveHdrBytes int, data buffer.Buffe } // WritePacket attempts to write the packet. -func (c *WriteContext) WritePacket(pkt stack.PacketBufferPtr, headerIncluded bool) tcpip.Error { +func (c *WriteContext) WritePacket(pkt *stack.PacketBuffer, headerIncluded bool) tcpip.Error { c.e.mu.RLock() pkt.Owner = c.e.owner c.e.mu.RUnlock() diff --git a/pkg/tcpip/transport/internal/noop/endpoint.go b/pkg/tcpip/transport/internal/noop/endpoint.go index 3e9c4c4bb..be2adae1c 100644 --- a/pkg/tcpip/transport/internal/noop/endpoint.go +++ b/pkg/tcpip/transport/internal/noop/endpoint.go @@ -137,7 +137,7 @@ func (*endpoint) GetSockOptInt(tcpip.SockOptInt) (int, tcpip.Error) { } // HandlePacket implements stack.RawTransportEndpoint.HandlePacket. -func (*endpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (*endpoint) HandlePacket(pkt *stack.PacketBuffer) { panic(fmt.Sprintf("unreachable: noop.endpoint should never be registered, but got packet: %+v", pkt)) } diff --git a/pkg/tcpip/transport/packet/endpoint.go b/pkg/tcpip/transport/packet/endpoint.go index f2bf08111..9166bca6c 100644 --- a/pkg/tcpip/transport/packet/endpoint.go +++ b/pkg/tcpip/transport/packet/endpoint.go @@ -40,7 +40,7 @@ import ( type packet struct { packetEntry // data holds the actual packet data, including any headers and payload. - data stack.PacketBufferPtr + data *stack.PacketBuffer receivedAt time.Time `state:".(int64)"` // senderAddr is the network address of the sender. senderAddr tcpip.FullAddress @@ -416,7 +416,7 @@ func (ep *endpoint) GetSockOptInt(opt tcpip.SockOptInt) (int, tcpip.Error) { } // HandlePacket implements stack.PacketEndpoint.HandlePacket. -func (ep *endpoint) HandlePacket(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, pkt stack.PacketBufferPtr) { +func (ep *endpoint) HandlePacket(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) { ep.rcvMu.Lock() // Drop the packet if our buffer is currently full. diff --git a/pkg/tcpip/transport/raw/endpoint.go b/pkg/tcpip/transport/raw/endpoint.go index 476932d2b..1634671ff 100644 --- a/pkg/tcpip/transport/raw/endpoint.go +++ b/pkg/tcpip/transport/raw/endpoint.go @@ -46,7 +46,7 @@ type rawPacket struct { rawPacketEntry // data holds the actual packet data, including any headers and // payload. - data stack.PacketBufferPtr + data *stack.PacketBuffer receivedAt time.Time `state:".(int64)"` // senderAddr is the network address of the sender. senderAddr tcpip.FullAddress @@ -586,7 +586,7 @@ func (e *endpoint) GetSockOptInt(opt tcpip.SockOptInt) (int, tcpip.Error) { } // HandlePacket implements stack.RawTransportEndpoint.HandlePacket. -func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(pkt *stack.PacketBuffer) { notifyReadableEvents := func() bool { e.mu.RLock() defer e.mu.RUnlock() diff --git a/pkg/tcpip/transport/tcp/connect.go b/pkg/tcpip/transport/tcp/connect.go index cc7bfafa9..dd3fa76a3 100644 --- a/pkg/tcpip/transport/tcp/connect.go +++ b/pkg/tcpip/transport/tcp/connect.go @@ -809,7 +809,7 @@ func (e *endpoint) sendSynTCP(r *stack.Route, tf tcpFields, opts header.TCPSynOp } // This method takes ownership of pkt. -func (e *endpoint) sendTCP(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso stack.GSO) tcpip.Error { +func (e *endpoint) sendTCP(r *stack.Route, tf tcpFields, pkt *stack.PacketBuffer, gso stack.GSO) tcpip.Error { tf.txHash = e.txHash if err := sendTCP(r, tf, pkt, gso, e.owner); err != nil { e.stats.SendErrors.SegmentSendToNetworkFailed.Increment() @@ -819,7 +819,7 @@ func (e *endpoint) sendTCP(r *stack.Route, tf tcpFields, pkt stack.PacketBufferP return nil } -func buildTCPHdr(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso stack.GSO) { +func buildTCPHdr(r *stack.Route, tf tcpFields, pkt *stack.PacketBuffer, gso stack.GSO) { optLen := len(tf.opts) tcp := header.TCP(pkt.TransportHeader().Push(header.TCPMinimumSize + optLen)) pkt.TransportProtocolNumber = header.TCPProtocolNumber @@ -848,7 +848,7 @@ func buildTCPHdr(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso st } } -func sendTCPBatch(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso stack.GSO, owner tcpip.PacketOwner) tcpip.Error { +func sendTCPBatch(r *stack.Route, tf tcpFields, pkt *stack.PacketBuffer, gso stack.GSO, owner tcpip.PacketOwner) tcpip.Error { optLen := len(tf.opts) if tf.rcvWnd > math.MaxUint16 { tf.rcvWnd = math.MaxUint16 @@ -899,7 +899,7 @@ func sendTCPBatch(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso s // sendTCP sends a TCP segment with the provided options via the provided // network endpoint and under the provided identity. This method takes // ownership of pkt. -func sendTCP(r *stack.Route, tf tcpFields, pkt stack.PacketBufferPtr, gso stack.GSO, owner tcpip.PacketOwner) tcpip.Error { +func sendTCP(r *stack.Route, tf tcpFields, pkt *stack.PacketBuffer, gso stack.GSO, owner tcpip.PacketOwner) tcpip.Error { if tf.rcvWnd > math.MaxUint16 { tf.rcvWnd = math.MaxUint16 } @@ -972,7 +972,7 @@ func (e *endpoint) sendEmptyRaw(flags header.TCPFlags, seq, ack seqnum.Value, rc // sendRaw sends a TCP segment to the endpoint's peer. This method takes // ownership of pkt. pkt must not have any headers set. -func (e *endpoint) sendRaw(pkt stack.PacketBufferPtr, flags header.TCPFlags, seq, ack seqnum.Value, rcvWnd seqnum.Size) tcpip.Error { +func (e *endpoint) sendRaw(pkt *stack.PacketBuffer, flags header.TCPFlags, seq, ack seqnum.Value, rcvWnd seqnum.Size) tcpip.Error { var sackBlocks []header.SACKBlock if e.EndpointState() == StateEstablished && e.rcv.pendingRcvdSegments.Len() > 0 && (flags&header.TCPFlagAck != 0) { sackBlocks = e.sack.Blocks[:e.sack.NumBlocks] diff --git a/pkg/tcpip/transport/tcp/dispatcher.go b/pkg/tcpip/transport/tcp/dispatcher.go index c5031af23..a2d4adbb1 100644 --- a/pkg/tcpip/transport/tcp/dispatcher.go +++ b/pkg/tcpip/transport/tcp/dispatcher.go @@ -409,7 +409,7 @@ func (d *dispatcher) wait() { // queuePacket queues an incoming packet to the matching tcp endpoint and // also queues the endpoint to a processor queue for processing. -func (d *dispatcher) queuePacket(stackEP stack.TransportEndpoint, id stack.TransportEndpointID, clock tcpip.Clock, pkt stack.PacketBufferPtr) { +func (d *dispatcher) queuePacket(stackEP stack.TransportEndpoint, id stack.TransportEndpointID, clock tcpip.Clock, pkt *stack.PacketBuffer) { d.mu.Lock() closed := d.closed d.mu.Unlock() diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go index 348c1004d..faab4d70d 100644 --- a/pkg/tcpip/transport/tcp/endpoint.go +++ b/pkg/tcpip/transport/tcp/endpoint.go @@ -2823,7 +2823,7 @@ func (e *endpoint) getRemoteAddress() tcpip.FullAddress { } } -func (*endpoint) HandlePacket(stack.TransportEndpointID, stack.PacketBufferPtr) { +func (*endpoint) HandlePacket(stack.TransportEndpointID, *stack.PacketBuffer) { // TCP HandlePacket is not required anymore as inbound packets first // land at the Dispatcher which then can either deliver using the // worker go routine or directly do the invoke the tcp processing inline @@ -2841,7 +2841,7 @@ func (e *endpoint) enqueueSegment(s *segment) bool { return true } -func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, pkt *stack.PacketBuffer) { // Update last error first. e.lastErrorMu.Lock() e.lastError = err @@ -2898,7 +2898,7 @@ func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, p } // HandleError implements stack.TransportEndpoint. -func (e *endpoint) HandleError(transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) HandleError(transErr stack.TransportError, pkt *stack.PacketBuffer) { handlePacketTooBig := func(mtu uint32) { e.sndQueueInfo.sndQueueMu.Lock() update := false diff --git a/pkg/tcpip/transport/tcp/forwarder.go b/pkg/tcpip/transport/tcp/forwarder.go index 0071093f2..39a522156 100644 --- a/pkg/tcpip/transport/tcp/forwarder.go +++ b/pkg/tcpip/transport/tcp/forwarder.go @@ -64,7 +64,7 @@ func NewForwarder(s *stack.Stack, rcvWnd, maxInFlight int, handler func(*Forward // // This function is expected to be passed as an argument to the // stack.SetTransportProtocolHandler function. -func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) bool { +func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) bool { s, err := newIncomingSegment(id, f.stack.Clock(), pkt) if err != nil { return false diff --git a/pkg/tcpip/transport/tcp/protocol.go b/pkg/tcpip/transport/tcp/protocol.go index 37c6fb6ab..73aff4d37 100644 --- a/pkg/tcpip/transport/tcp/protocol.go +++ b/pkg/tcpip/transport/tcp/protocol.go @@ -145,7 +145,7 @@ func (*protocol) ParsePorts(v []byte) (src, dst uint16, err tcpip.Error) { // to a specific processing queue. Each queue is serviced by its own processor // goroutine which is responsible for dequeuing and doing full TCP dispatch of // the packet. -func (p *protocol) QueuePacket(ep stack.TransportEndpoint, id stack.TransportEndpointID, pkt stack.PacketBufferPtr) { +func (p *protocol) QueuePacket(ep stack.TransportEndpoint, id stack.TransportEndpointID, pkt *stack.PacketBuffer) { p.dispatcher.queuePacket(ep, id, p.stack.Clock(), pkt) } @@ -156,7 +156,7 @@ func (p *protocol) QueuePacket(ep stack.TransportEndpoint, id stack.TransportEnd // a reset is sent in response to any incoming segment except another reset. In // particular, SYNs addressed to a non-existent connection are rejected by this // means." -func (p *protocol) HandleUnknownDestinationPacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) stack.UnknownDestinationPacketDisposition { +func (p *protocol) HandleUnknownDestinationPacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) stack.UnknownDestinationPacketDisposition { s, err := newIncomingSegment(id, p.stack.Clock(), pkt) if err != nil { return stack.UnknownDestinationPacketMalformed @@ -501,7 +501,7 @@ func (p *protocol) Resume() { } // Parse implements stack.TransportProtocol.Parse. -func (*protocol) Parse(pkt stack.PacketBufferPtr) bool { +func (*protocol) Parse(pkt *stack.PacketBuffer) bool { return parse.TCP(pkt) } diff --git a/pkg/tcpip/transport/tcp/segment.go b/pkg/tcpip/transport/tcp/segment.go index df5206582..f640cbefa 100644 --- a/pkg/tcpip/transport/tcp/segment.go +++ b/pkg/tcpip/transport/tcp/segment.go @@ -59,7 +59,7 @@ type segment struct { qFlags queueFlags id stack.TransportEndpointID `state:"manual"` - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer sequenceNumber seqnum.Value ackNumber seqnum.Value @@ -92,7 +92,7 @@ type segment struct { lost bool } -func newIncomingSegment(id stack.TransportEndpointID, clock tcpip.Clock, pkt stack.PacketBufferPtr) (*segment, error) { +func newIncomingSegment(id stack.TransportEndpointID, clock tcpip.Clock, pkt *stack.PacketBuffer) (*segment, error) { hdr := header.TCP(pkt.TransportHeader().Slice()) netHdr := pkt.Network() csum, csumValid, ok := header.TCPValid( diff --git a/pkg/tcpip/transport/tcp/snd.go b/pkg/tcpip/transport/tcp/snd.go index 838e299fe..e3315a66d 100644 --- a/pkg/tcpip/transport/tcp/snd.go +++ b/pkg/tcpip/transport/tcp/snd.go @@ -1668,7 +1668,7 @@ func (s *sender) sendSegment(seg *segment) tcpip.Error { // flags and sequence number. // +checklocks:s.ep.mu // +checklocksalias:s.ep.rcv.ep.mu=s.ep.mu -func (s *sender) sendSegmentFromPacketBuffer(pkt stack.PacketBufferPtr, flags header.TCPFlags, seq seqnum.Value) tcpip.Error { +func (s *sender) sendSegmentFromPacketBuffer(pkt *stack.PacketBuffer, flags header.TCPFlags, seq seqnum.Value) tcpip.Error { s.LastSendTime = s.ep.stack.Clock().NowMonotonic() if seq == s.RTTMeasureSeqNum { s.RTTMeasureTime = s.LastSendTime diff --git a/pkg/tcpip/transport/udp/endpoint.go b/pkg/tcpip/transport/udp/endpoint.go index 5472c1b25..82100f9ff 100644 --- a/pkg/tcpip/transport/udp/endpoint.go +++ b/pkg/tcpip/transport/udp/endpoint.go @@ -40,7 +40,7 @@ type udpPacket struct { senderAddress tcpip.FullAddress destinationAddress tcpip.FullAddress packetInfo tcpip.IPPacketInfo - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer receivedAt time.Time `state:".(int64)"` // tosOrTClass stores either the Type of Service for IPv4 or the Traffic Class // for IPv6. @@ -908,7 +908,7 @@ func (e *endpoint) Readiness(mask waiter.EventMask) waiter.EventMask { // HandlePacket is called by the stack when new packets arrive to this transport // endpoint. -func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) { +func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) { // Get the header then trim it from the view. hdr := header.UDP(pkt.TransportHeader().Slice()) netHdr := pkt.Network() @@ -1000,7 +1000,7 @@ func (e *endpoint) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBu } } -func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, pkt *stack.PacketBuffer) { // Update last error first. e.lastErrorMu.Lock() e.lastError = err @@ -1050,7 +1050,7 @@ func (e *endpoint) onICMPError(err tcpip.Error, transErr stack.TransportError, p } // HandleError implements stack.TransportEndpoint. -func (e *endpoint) HandleError(transErr stack.TransportError, pkt stack.PacketBufferPtr) { +func (e *endpoint) HandleError(transErr stack.TransportError, pkt *stack.PacketBuffer) { // TODO(gvisor.dev/issues/5270): Handle all transport errors. switch transErr.Kind() { case stack.DestinationPortUnreachableTransportError: diff --git a/pkg/tcpip/transport/udp/forwarder.go b/pkg/tcpip/transport/udp/forwarder.go index 711a5ed3d..7950abe58 100644 --- a/pkg/tcpip/transport/udp/forwarder.go +++ b/pkg/tcpip/transport/udp/forwarder.go @@ -43,7 +43,7 @@ func NewForwarder(s *stack.Stack, handler func(*ForwarderRequest)) *Forwarder { // // This function is expected to be passed as an argument to the // stack.SetTransportProtocolHandler function. -func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) bool { +func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) bool { f.handler(&ForwarderRequest{ stack: f.stack, id: id, @@ -59,7 +59,7 @@ func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketB type ForwarderRequest struct { stack *stack.Stack id stack.TransportEndpointID - pkt stack.PacketBufferPtr + pkt *stack.PacketBuffer } // ID returns the 4-tuple (src address, src port, dst address, dst port) that diff --git a/pkg/tcpip/transport/udp/protocol.go b/pkg/tcpip/transport/udp/protocol.go index d4de0d2b4..c26ac4d64 100644 --- a/pkg/tcpip/transport/udp/protocol.go +++ b/pkg/tcpip/transport/udp/protocol.go @@ -77,7 +77,7 @@ func (*protocol) ParsePorts(v []byte) (src, dst uint16, err tcpip.Error) { // HandleUnknownDestinationPacket handles packets that are targeted at this // protocol but don't match any existing endpoint. -func (p *protocol) HandleUnknownDestinationPacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) stack.UnknownDestinationPacketDisposition { +func (p *protocol) HandleUnknownDestinationPacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) stack.UnknownDestinationPacketDisposition { hdr := header.UDP(pkt.TransportHeader().Slice()) netHdr := pkt.Network() lengthValid, csumValid := header.UDPValid( @@ -124,7 +124,7 @@ func (*protocol) Pause() {} func (*protocol) Resume() {} // Parse implements stack.TransportProtocol.Parse. -func (*protocol) Parse(pkt stack.PacketBufferPtr) bool { +func (*protocol) Parse(pkt *stack.PacketBuffer) bool { return parse.UDP(pkt) }