mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Pass PacketBuffer as pointer.
Historically we've been passing PacketBuffer by shallow copying through out the stack. Right now, this is only correct as the caller would not use PacketBuffer after passing into the next layer in netstack. With new buffer management effort in gVisor/netstack, PacketBuffer will own a Buffer (to be added). Internally, both PacketBuffer and Buffer may have pointers and shallow copying shouldn't be used. Updates #2404. PiperOrigin-RevId: 314610879
This commit is contained in:
@@ -111,7 +111,7 @@ func (*OwnerMatcher) Name() string {
|
||||
}
|
||||
|
||||
// Match implements Matcher.Match.
|
||||
func (om *OwnerMatcher) Match(hook stack.Hook, pkt stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
func (om *OwnerMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
// Support only for OUTPUT chain.
|
||||
// TODO(gvisor.dev/issue/170): Need to support for POSTROUTING chain also.
|
||||
if hook != stack.Output {
|
||||
|
||||
@@ -96,7 +96,7 @@ func (*TCPMatcher) Name() string {
|
||||
}
|
||||
|
||||
// Match implements Matcher.Match.
|
||||
func (tm *TCPMatcher) Match(hook stack.Hook, pkt stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
func (tm *TCPMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
netHeader := header.IPv4(pkt.NetworkHeader)
|
||||
|
||||
if netHeader.TransportProtocol() != header.TCPProtocolNumber {
|
||||
|
||||
@@ -93,7 +93,7 @@ func (*UDPMatcher) Name() string {
|
||||
}
|
||||
|
||||
// Match implements Matcher.Match.
|
||||
func (um *UDPMatcher) Match(hook stack.Hook, pkt stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
func (um *UDPMatcher) Match(hook stack.Hook, pkt *stack.PacketBuffer, interfaceName string) (bool, bool) {
|
||||
netHeader := header.IPv4(pkt.NetworkHeader)
|
||||
|
||||
// TODO(gvisor.dev/issue/170): Proto checks should ultimately be moved
|
||||
|
||||
@@ -181,12 +181,12 @@ func (e *Endpoint) NumQueued() int {
|
||||
}
|
||||
|
||||
// InjectInbound injects an inbound packet.
|
||||
func (e *Endpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (e *Endpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.InjectLinkAddr(protocol, "", pkt)
|
||||
}
|
||||
|
||||
// InjectLinkAddr injects an inbound packet with a remote link address.
|
||||
func (e *Endpoint) InjectLinkAddr(protocol tcpip.NetworkProtocolNumber, remote tcpip.LinkAddress, pkt stack.PacketBuffer) {
|
||||
func (e *Endpoint) InjectLinkAddr(protocol tcpip.NetworkProtocolNumber, remote tcpip.LinkAddress, pkt *stack.PacketBuffer) {
|
||||
e.dispatcher.DeliverNetworkPacket(remote, "" /* local */, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -229,13 +229,13 @@ func (e *Endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
}
|
||||
|
||||
// WritePacket stores outbound packets into the channel.
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
// Clone r then release its resource so we only get the relevant fields from
|
||||
// stack.Route without holding a reference to a NIC's endpoint.
|
||||
route := r.Clone()
|
||||
route.Release()
|
||||
p := PacketInfo{
|
||||
Pkt: &pkt,
|
||||
Pkt: pkt,
|
||||
Proto: protocol,
|
||||
GSO: gso,
|
||||
Route: route,
|
||||
|
||||
@@ -387,7 +387,7 @@ const (
|
||||
|
||||
// WritePacket writes outbound packets to the file descriptor. If it is not
|
||||
// currently writable, the packet is dropped.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if e.hdrSize > 0 {
|
||||
// Add ethernet header if needed.
|
||||
eth := header.Ethernet(pkt.Header.Prepend(header.EthernetMinimumSize))
|
||||
@@ -641,7 +641,7 @@ func (e *InjectableEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
|
||||
}
|
||||
|
||||
// InjectInbound injects an inbound packet.
|
||||
func (e *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (e *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, protocol, pkt)
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ const (
|
||||
type packetInfo struct {
|
||||
raddr tcpip.LinkAddress
|
||||
proto tcpip.NetworkProtocolNumber
|
||||
contents stack.PacketBuffer
|
||||
contents *stack.PacketBuffer
|
||||
}
|
||||
|
||||
type context struct {
|
||||
@@ -103,7 +103,7 @@ func (c *context) cleanup() {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *context) DeliverNetworkPacket(remote tcpip.LinkAddress, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (c *context) DeliverNetworkPacket(remote tcpip.LinkAddress, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
c.ch <- packetInfo{remote, protocol, pkt}
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ func testWritePacket(t *testing.T, plen int, eth bool, gsoMaxSize uint32, hash u
|
||||
L3HdrLen: header.IPv4MaximumHeaderSize,
|
||||
}
|
||||
}
|
||||
if err := c.ep.WritePacket(r, gso, proto, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(r, gso, proto, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: payload.ToVectorisedView(),
|
||||
Hash: hash,
|
||||
@@ -295,7 +295,7 @@ func TestPreserveSrcAddress(t *testing.T) {
|
||||
// WritePacket panics given a prependable with anything less than
|
||||
// the minimum size of the ethernet header.
|
||||
hdr := buffer.NewPrependable(header.EthernetMinimumSize)
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, proto, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, proto, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buffer.VectorisedView{},
|
||||
}); err != nil {
|
||||
@@ -358,7 +358,7 @@ func TestDeliverPacket(t *testing.T) {
|
||||
want := packetInfo{
|
||||
raddr: raddr,
|
||||
proto: proto,
|
||||
contents: stack.PacketBuffer{
|
||||
contents: &stack.PacketBuffer{
|
||||
Data: buffer.View(b).ToVectorisedView(),
|
||||
LinkHeader: buffer.View(hdr),
|
||||
},
|
||||
|
||||
@@ -191,7 +191,7 @@ func (d *packetMMapDispatcher) dispatch() (bool, *tcpip.Error) {
|
||||
}
|
||||
|
||||
pkt = pkt[d.e.hdrSize:]
|
||||
d.e.dispatcher.DeliverNetworkPacket(remote, local, p, stack.PacketBuffer{
|
||||
d.e.dispatcher.DeliverNetworkPacket(remote, local, p, &stack.PacketBuffer{
|
||||
Data: buffer.View(pkt).ToVectorisedView(),
|
||||
LinkHeader: buffer.View(eth),
|
||||
})
|
||||
|
||||
@@ -139,7 +139,7 @@ func (d *readVDispatcher) dispatch() (bool, *tcpip.Error) {
|
||||
}
|
||||
|
||||
used := d.capViews(n, BufConfig)
|
||||
pkt := stack.PacketBuffer{
|
||||
pkt := &stack.PacketBuffer{
|
||||
Data: buffer.NewVectorisedView(n, append([]buffer.View(nil), d.views[:used]...)),
|
||||
LinkHeader: buffer.View(eth),
|
||||
}
|
||||
@@ -296,7 +296,7 @@ func (d *recvMMsgDispatcher) dispatch() (bool, *tcpip.Error) {
|
||||
}
|
||||
|
||||
used := d.capViews(k, int(n), BufConfig)
|
||||
pkt := stack.PacketBuffer{
|
||||
pkt := &stack.PacketBuffer{
|
||||
Data: buffer.NewVectorisedView(int(n), append([]buffer.View(nil), d.views[k][:used]...)),
|
||||
LinkHeader: buffer.View(eth),
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ func (*endpoint) Wait() {}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.WritePacket. It delivers outbound
|
||||
// packets to the network-layer dispatcher.
|
||||
func (e *endpoint) WritePacket(_ *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WritePacket(_ *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
views := make([]buffer.View, 1, 1+len(pkt.Data.Views()))
|
||||
views[0] = pkt.Header.View()
|
||||
views = append(views, pkt.Data.Views()...)
|
||||
@@ -84,7 +84,7 @@ func (e *endpoint) WritePacket(_ *stack.Route, _ *stack.GSO, protocol tcpip.Netw
|
||||
// Because we're immediately turning around and writing the packet back
|
||||
// to the rx path, we intentionally don't preserve the remote and local
|
||||
// link addresses from the stack.Route we're passed.
|
||||
e.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, protocol, stack.PacketBuffer{
|
||||
e.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, protocol, &stack.PacketBuffer{
|
||||
Data: buffer.NewVectorisedView(len(views[0])+pkt.Data.Size(), views),
|
||||
})
|
||||
|
||||
@@ -106,7 +106,7 @@ func (e *endpoint) WriteRawPacket(vv buffer.VectorisedView) *tcpip.Error {
|
||||
}
|
||||
linkHeader := header.Ethernet(hdr)
|
||||
vv.TrimFront(len(linkHeader))
|
||||
e.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, linkHeader.Type(), stack.PacketBuffer{
|
||||
e.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, linkHeader.Type(), &stack.PacketBuffer{
|
||||
Data: vv,
|
||||
LinkHeader: buffer.View(linkHeader),
|
||||
})
|
||||
|
||||
@@ -80,7 +80,7 @@ func (m *InjectableEndpoint) IsAttached() bool {
|
||||
}
|
||||
|
||||
// InjectInbound implements stack.InjectableLinkEndpoint.
|
||||
func (m *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (m *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
m.dispatcher.DeliverNetworkPacket("" /* remote */, "" /* local */, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func (m *InjectableEndpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts s
|
||||
// WritePacket writes outbound packets to the appropriate LinkInjectableEndpoint
|
||||
// based on the RemoteAddress. HandleLocal only works if r.RemoteAddress has a
|
||||
// route registered in this endpoint.
|
||||
func (m *InjectableEndpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (m *InjectableEndpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if endpoint, ok := m.routes[r.RemoteAddress]; ok {
|
||||
return endpoint.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ func TestInjectableEndpointDispatch(t *testing.T) {
|
||||
hdr.Prepend(1)[0] = 0xFA
|
||||
packetRoute := stack.Route{RemoteAddress: dstIP}
|
||||
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, stack.PacketBuffer{
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buffer.NewViewFromBytes([]byte{0xFB}).ToVectorisedView(),
|
||||
})
|
||||
@@ -70,7 +70,7 @@ func TestInjectableEndpointDispatchHdrOnly(t *testing.T) {
|
||||
hdr := buffer.NewPrependable(1)
|
||||
hdr.Prepend(1)[0] = 0xFA
|
||||
packetRoute := stack.Route{RemoteAddress: dstIP}
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, stack.PacketBuffer{
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buffer.NewView(0).ToVectorisedView(),
|
||||
})
|
||||
|
||||
@@ -102,7 +102,7 @@ func (q *queueDispatcher) dispatchLoop() {
|
||||
}
|
||||
|
||||
// DeliverNetworkPacket implements stack.NetworkDispatcher.DeliverNetworkPacket.
|
||||
func (e *endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (e *endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.dispatcher.DeliverNetworkPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ func (e *endpoint) GSOMaxSize() uint32 {
|
||||
}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.WritePacket.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
// WritePacket caller's do not set the following fields in PacketBuffer
|
||||
// so we populate them here.
|
||||
newRoute := r.Clone()
|
||||
@@ -154,7 +154,7 @@ func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.Ne
|
||||
pkt.GSOOptions = gso
|
||||
pkt.NetworkProtocolNumber = protocol
|
||||
d := e.dispatchers[int(pkt.Hash)%len(e.dispatchers)]
|
||||
if !d.q.enqueue(&pkt) {
|
||||
if !d.q.enqueue(pkt) {
|
||||
return tcpip.ErrNoBufferSpace
|
||||
}
|
||||
d.newPacketWaker.Assert()
|
||||
|
||||
@@ -185,7 +185,7 @@ func (e *endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
|
||||
// WritePacket writes outbound packets to the file descriptor. If it is not
|
||||
// currently writable, the packet is dropped.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WritePacket(r *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
// Add the ethernet header here.
|
||||
eth := header.Ethernet(pkt.Header.Prepend(header.EthernetMinimumSize))
|
||||
pkt.LinkHeader = buffer.View(eth)
|
||||
@@ -275,7 +275,7 @@ func (e *endpoint) dispatchLoop(d stack.NetworkDispatcher) {
|
||||
|
||||
// Send packet up the stack.
|
||||
eth := header.Ethernet(b[:header.EthernetMinimumSize])
|
||||
d.DeliverNetworkPacket(eth.SourceAddress(), eth.DestinationAddress(), eth.Type(), stack.PacketBuffer{
|
||||
d.DeliverNetworkPacket(eth.SourceAddress(), eth.DestinationAddress(), eth.Type(), &stack.PacketBuffer{
|
||||
Data: buffer.View(b[header.EthernetMinimumSize:]).ToVectorisedView(),
|
||||
LinkHeader: buffer.View(eth),
|
||||
})
|
||||
|
||||
@@ -131,7 +131,7 @@ func newTestContext(t *testing.T, mtu, bufferSize uint32, addr tcpip.LinkAddress
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *testContext) DeliverNetworkPacket(remoteLinkAddr, localLinkAddr tcpip.LinkAddress, proto tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (c *testContext) DeliverNetworkPacket(remoteLinkAddr, localLinkAddr tcpip.LinkAddress, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
c.mu.Lock()
|
||||
c.packets = append(c.packets, packetInfo{
|
||||
addr: remoteLinkAddr,
|
||||
@@ -273,7 +273,7 @@ func TestSimpleSend(t *testing.T) {
|
||||
randomFill(buf)
|
||||
|
||||
proto := tcpip.NetworkProtocolNumber(rand.Intn(0x10000))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -345,7 +345,7 @@ func TestPreserveSrcAddressInSend(t *testing.T) {
|
||||
hdr := buffer.NewPrependable(header.EthernetMinimumSize)
|
||||
|
||||
proto := tcpip.NetworkProtocolNumber(rand.Intn(0x10000))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
}); err != nil {
|
||||
t.Fatalf("WritePacket failed: %v", err)
|
||||
@@ -401,7 +401,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
for i := queuePipeSize / 40; i > 0; i-- {
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -419,7 +419,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
|
||||
// Next attempt to write must fail.
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != want {
|
||||
@@ -447,7 +447,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
// Send two packets so that the id slice has at least two slots.
|
||||
for i := 2; i > 0; i-- {
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -470,7 +470,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
ids := make(map[uint64]struct{})
|
||||
for i := queuePipeSize / 40; i > 0; i-- {
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -488,7 +488,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
|
||||
// Next attempt to write must fail.
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != want {
|
||||
@@ -514,7 +514,7 @@ func TestFillTxMemory(t *testing.T) {
|
||||
ids := make(map[uint64]struct{})
|
||||
for i := queueDataSize / bufferSize; i > 0; i-- {
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -533,7 +533,7 @@ func TestFillTxMemory(t *testing.T) {
|
||||
|
||||
// Next attempt to write must fail.
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
@@ -561,7 +561,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
// until there is only one buffer left.
|
||||
for i := queueDataSize/bufferSize - 1; i > 0; i-- {
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
@@ -577,7 +577,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
{
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
uu := buffer.NewView(bufferSize).ToVectorisedView()
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: uu,
|
||||
}); err != want {
|
||||
@@ -588,7 +588,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
// Attempt to write the one-buffer packet again. It must succeed.
|
||||
{
|
||||
hdr := buffer.NewPrependable(int(c.ep.MaxHeaderLength()))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, stack.PacketBuffer{
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: buf.ToVectorisedView(),
|
||||
}); err != nil {
|
||||
|
||||
@@ -120,8 +120,8 @@ 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(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
e.dumpPacket("recv", nil, protocol, &pkt)
|
||||
func (e *endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.dumpPacket("recv", nil, protocol, pkt)
|
||||
e.dispatcher.DeliverNetworkPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -208,8 +208,8 @@ func (e *endpoint) dumpPacket(prefix string, gso *stack.GSO, protocol tcpip.Netw
|
||||
// WritePacket implements the stack.LinkEndpoint interface. It is called by
|
||||
// higher-level protocols to write packets; it just logs the packet and
|
||||
// forwards the request to the lower endpoint.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
e.dumpPacket("send", gso, protocol, &pkt)
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.dumpPacket("send", gso, protocol, pkt)
|
||||
return e.lower.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
|
||||
@@ -213,7 +213,7 @@ func (d *Device) Write(data []byte) (int64, error) {
|
||||
remote = tcpip.LinkAddress(zeroMAC[:])
|
||||
}
|
||||
|
||||
pkt := stack.PacketBuffer{
|
||||
pkt := &stack.PacketBuffer{
|
||||
Data: buffer.View(data).ToVectorisedView(),
|
||||
}
|
||||
if ethHdr != nil {
|
||||
|
||||
@@ -50,7 +50,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(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (e *Endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
if !e.dispatchGate.Enter() {
|
||||
return
|
||||
}
|
||||
@@ -99,7 +99,7 @@ func (e *Endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
// WritePacket implements stack.LinkEndpoint.WritePacket. It is called by
|
||||
// higher-level protocols to write packets. It only forwards packets to the
|
||||
// lower endpoint if Wait or WaitWrite haven't been called.
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if !e.writeGate.Enter() {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ type countedEndpoint struct {
|
||||
dispatcher stack.NetworkDispatcher
|
||||
}
|
||||
|
||||
func (e *countedEndpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) {
|
||||
func (e *countedEndpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.dispatchCount++
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ func (e *countedEndpoint) LinkAddress() tcpip.LinkAddress {
|
||||
return e.linkAddr
|
||||
}
|
||||
|
||||
func (e *countedEndpoint) WritePacket(r *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *countedEndpoint) WritePacket(r *stack.Route, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.writeCount++
|
||||
return nil
|
||||
}
|
||||
@@ -89,21 +89,21 @@ func TestWaitWrite(t *testing.T) {
|
||||
wep := New(ep)
|
||||
|
||||
// Write and check that it goes through.
|
||||
wep.WritePacket(nil, nil /* gso */, 0, stack.PacketBuffer{})
|
||||
wep.WritePacket(nil, nil /* gso */, 0, &stack.PacketBuffer{})
|
||||
if want := 1; ep.writeCount != want {
|
||||
t.Fatalf("Unexpected writeCount: got=%v, want=%v", ep.writeCount, want)
|
||||
}
|
||||
|
||||
// Wait on dispatches, then try to write. It must go through.
|
||||
wep.WaitDispatch()
|
||||
wep.WritePacket(nil, nil /* gso */, 0, stack.PacketBuffer{})
|
||||
wep.WritePacket(nil, nil /* gso */, 0, &stack.PacketBuffer{})
|
||||
if want := 2; ep.writeCount != want {
|
||||
t.Fatalf("Unexpected writeCount: got=%v, want=%v", ep.writeCount, want)
|
||||
}
|
||||
|
||||
// Wait on writes, then try to write. It must not go through.
|
||||
wep.WaitWrite()
|
||||
wep.WritePacket(nil, nil /* gso */, 0, stack.PacketBuffer{})
|
||||
wep.WritePacket(nil, nil /* gso */, 0, &stack.PacketBuffer{})
|
||||
if want := 2; ep.writeCount != want {
|
||||
t.Fatalf("Unexpected writeCount: got=%v, want=%v", ep.writeCount, want)
|
||||
}
|
||||
@@ -120,21 +120,21 @@ func TestWaitDispatch(t *testing.T) {
|
||||
}
|
||||
|
||||
// Dispatch and check that it goes through.
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, stack.PacketBuffer{})
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, &stack.PacketBuffer{})
|
||||
if want := 1; ep.dispatchCount != want {
|
||||
t.Fatalf("Unexpected dispatchCount: got=%v, want=%v", ep.dispatchCount, want)
|
||||
}
|
||||
|
||||
// Wait on writes, then try to dispatch. It must go through.
|
||||
wep.WaitWrite()
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, stack.PacketBuffer{})
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, &stack.PacketBuffer{})
|
||||
if want := 2; ep.dispatchCount != want {
|
||||
t.Fatalf("Unexpected dispatchCount: got=%v, want=%v", ep.dispatchCount, want)
|
||||
}
|
||||
|
||||
// Wait on dispatches, then try to dispatch. It must not go through.
|
||||
wep.WaitDispatch()
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, stack.PacketBuffer{})
|
||||
ep.dispatcher.DeliverNetworkPacket("", "", 0, &stack.PacketBuffer{})
|
||||
if want := 2; ep.dispatchCount != want {
|
||||
t.Fatalf("Unexpected dispatchCount: got=%v, want=%v", ep.dispatchCount, want)
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ func (e *endpoint) MaxHeaderLength() uint16 {
|
||||
|
||||
func (e *endpoint) Close() {}
|
||||
|
||||
func (e *endpoint) WritePacket(*stack.Route, *stack.GSO, stack.NetworkHeaderParams, stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WritePacket(*stack.Route, *stack.GSO, stack.NetworkHeaderParams, *stack.PacketBuffer) *tcpip.Error {
|
||||
return tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
@@ -94,11 +94,11 @@ func (e *endpoint) WritePackets(*stack.Route, *stack.GSO, stack.PacketBufferList
|
||||
return 0, tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
return tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
func (e *endpoint) HandlePacket(r *stack.Route, pkt stack.PacketBuffer) {
|
||||
func (e *endpoint) HandlePacket(r *stack.Route, pkt *stack.PacketBuffer) {
|
||||
v, ok := pkt.Data.PullUp(header.ARPSize)
|
||||
if !ok {
|
||||
return
|
||||
@@ -122,7 +122,7 @@ func (e *endpoint) HandlePacket(r *stack.Route, pkt stack.PacketBuffer) {
|
||||
copy(packet.ProtocolAddressSender(), h.ProtocolAddressTarget())
|
||||
copy(packet.HardwareAddressTarget(), h.HardwareAddressSender())
|
||||
copy(packet.ProtocolAddressTarget(), h.ProtocolAddressSender())
|
||||
e.linkEP.WritePacket(r, nil /* gso */, ProtocolNumber, stack.PacketBuffer{
|
||||
e.linkEP.WritePacket(r, nil /* gso */, ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
})
|
||||
fallthrough // also fill the cache from requests
|
||||
@@ -177,7 +177,7 @@ func (*protocol) LinkAddressRequest(addr, localAddr tcpip.Address, linkEP stack.
|
||||
copy(h.ProtocolAddressSender(), localAddr)
|
||||
copy(h.ProtocolAddressTarget(), addr)
|
||||
|
||||
return linkEP.WritePacket(r, nil /* gso */, ProtocolNumber, stack.PacketBuffer{
|
||||
return linkEP.WritePacket(r, nil /* gso */, ProtocolNumber, &stack.PacketBuffer{
|
||||
Header: hdr,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ func TestDirectRequest(t *testing.T) {
|
||||
|
||||
inject := func(addr tcpip.Address) {
|
||||
copy(h.ProtocolAddressTarget(), addr)
|
||||
c.linkEP.InjectInbound(arp.ProtocolNumber, stack.PacketBuffer{
|
||||
c.linkEP.InjectInbound(arp.ProtocolNumber, &stack.PacketBuffer{
|
||||
Data: v.ToVectorisedView(),
|
||||
})
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user