mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Only pass stack.Route's fields to LinkEndpoints
stack.Route is used to send network packets and resolve link addresses. A LinkEndpoint does not need to do either of these and only needs the route's fields at the time of the packet write request. Since LinkEndpoints only need the route's fields when writing packets, pass a stack.RouteInfo instead. PiperOrigin-RevId: 352108405
This commit is contained in:
committed by
gVisor bot
parent
12d9790833
commit
fd5b52c87f
@@ -229,12 +229,12 @@ 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.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
p := PacketInfo{
|
||||
Pkt: pkt,
|
||||
Proto: protocol,
|
||||
GSO: gso,
|
||||
Route: r.GetFields(),
|
||||
Route: r,
|
||||
}
|
||||
|
||||
e.q.Write(p)
|
||||
@@ -243,14 +243,14 @@ func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.Ne
|
||||
}
|
||||
|
||||
// WritePackets stores outbound packets into the channel.
|
||||
func (e *Endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *Endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
n := 0
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
p := PacketInfo{
|
||||
Pkt: pkt,
|
||||
Proto: protocol,
|
||||
GSO: gso,
|
||||
Route: r.GetFields(),
|
||||
Route: r,
|
||||
}
|
||||
|
||||
if !e.q.Write(p) {
|
||||
|
||||
@@ -61,17 +61,17 @@ func (e *Endpoint) Capabilities() stack.LinkEndpointCapabilities {
|
||||
}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.AddHeader(e.Endpoint.LinkAddress(), r.RemoteLinkAddress(), proto, pkt)
|
||||
func (e *Endpoint) WritePacket(r stack.RouteInfo, gso *stack.GSO, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.AddHeader(e.Endpoint.LinkAddress(), r.RemoteLinkAddress, proto, pkt)
|
||||
return e.Endpoint.WritePacket(r, gso, proto, pkt)
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, proto tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *Endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, proto tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
linkAddr := e.Endpoint.LinkAddress()
|
||||
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
e.AddHeader(linkAddr, r.RemoteLinkAddress(), proto, pkt)
|
||||
e.AddHeader(linkAddr, r.RemoteLinkAddress, proto, pkt)
|
||||
}
|
||||
|
||||
return e.Endpoint.WritePackets(r, gso, pkts, proto)
|
||||
|
||||
@@ -411,9 +411,9 @@ func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.Net
|
||||
|
||||
// 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.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if e.hdrSize > 0 {
|
||||
e.AddHeader(r.LocalLinkAddress, r.RemoteLinkAddress(), protocol, pkt)
|
||||
e.AddHeader(r.LocalLinkAddress, r.RemoteLinkAddress, protocol, pkt)
|
||||
}
|
||||
|
||||
var builder iovec.Builder
|
||||
@@ -456,7 +456,7 @@ func (e *endpoint) sendBatch(batchFD int, batch []*stack.PacketBuffer) (int, *tc
|
||||
mmsgHdrs := make([]rawfile.MMsgHdr, 0, len(batch))
|
||||
for _, pkt := range batch {
|
||||
if e.hdrSize > 0 {
|
||||
e.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress(), pkt.NetworkProtocolNumber, pkt)
|
||||
e.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
}
|
||||
|
||||
var vnetHdrBuf []byte
|
||||
@@ -518,7 +518,7 @@ func (e *endpoint) sendBatch(batchFD int, batch []*stack.PacketBuffer) (int, *tc
|
||||
// - pkt.EgressRoute
|
||||
// - pkt.GSOOptions
|
||||
// - pkt.NetworkProtocolNumber
|
||||
func (e *endpoint) WritePackets(_ *stack.Route, _ *stack.GSO, pkts stack.PacketBufferList, _ tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *endpoint) WritePackets(_ stack.RouteInfo, _ *stack.GSO, pkts stack.PacketBufferList, _ tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
// Preallocate to avoid repeated reallocation as we append to batch.
|
||||
// batchSz is 47 because when SWGSO is in use then a single 65KB TCP
|
||||
// segment can get split into 46 segments of 1420 bytes and a single 216
|
||||
|
||||
@@ -183,8 +183,8 @@ func testWritePacket(t *testing.T, plen int, eth bool, gsoMaxSize uint32, hash u
|
||||
c := newContext(t, &Options{Address: laddr, MTU: mtu, EthernetHeader: eth, GSOMaxSize: gsoMaxSize})
|
||||
defer c.cleanup()
|
||||
|
||||
var r stack.Route
|
||||
r.ResolveWith(raddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = raddr
|
||||
|
||||
// Build payload.
|
||||
payload := buffer.NewView(plen)
|
||||
@@ -219,7 +219,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, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, gso, proto, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -323,9 +323,9 @@ func TestPreserveSrcAddress(t *testing.T) {
|
||||
defer c.cleanup()
|
||||
|
||||
// Set LocalLinkAddress in route to the value of the bridged address.
|
||||
var r stack.Route
|
||||
var r stack.RouteInfo
|
||||
r.LocalLinkAddress = baddr
|
||||
r.ResolveWith(raddr)
|
||||
r.RemoteLinkAddress = raddr
|
||||
|
||||
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||
// WritePacket panics given a prependable with anything less than
|
||||
@@ -334,7 +334,7 @@ func TestPreserveSrcAddress(t *testing.T) {
|
||||
ReserveHeaderBytes: header.EthernetMinimumSize,
|
||||
Data: buffer.VectorisedView{},
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, proto, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed: %v", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -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.RouteInfo, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
// Construct data as the unparsed portion for the loopback packet.
|
||||
data := buffer.NewVectorisedView(pkt.Size(), pkt.Views())
|
||||
|
||||
@@ -92,7 +92,7 @@ func (e *endpoint) WritePacket(_ *stack.Route, _ *stack.GSO, protocol tcpip.Netw
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
func (e *endpoint) WritePackets(*stack.Route, *stack.GSO, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *endpoint) WritePackets(stack.RouteInfo, *stack.GSO, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ func (m *InjectableEndpoint) InjectInbound(protocol tcpip.NetworkProtocolNumber,
|
||||
// WritePackets 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) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (m *InjectableEndpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
endpoint, ok := m.routes[r.RemoteAddress]
|
||||
if !ok {
|
||||
return 0, tcpip.ErrNoRoute
|
||||
@@ -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.RouteInfo, 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)
|
||||
}
|
||||
|
||||
@@ -51,10 +51,10 @@ func TestInjectableEndpointDispatch(t *testing.T) {
|
||||
Data: buffer.NewViewFromBytes([]byte{0xFB}).ToVectorisedView(),
|
||||
})
|
||||
pkt.TransportHeader().Push(1)[0] = 0xFA
|
||||
var packetRoute stack.Route
|
||||
var packetRoute stack.RouteInfo
|
||||
packetRoute.RemoteAddress = dstIP
|
||||
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, pkt)
|
||||
endpoint.WritePacket(packetRoute, nil /* gso */, ipv4.ProtocolNumber, pkt)
|
||||
|
||||
buf := make([]byte, 6500)
|
||||
bytesRead, err := sock.Read(buf)
|
||||
@@ -74,9 +74,9 @@ func TestInjectableEndpointDispatchHdrOnly(t *testing.T) {
|
||||
Data: buffer.NewView(0).ToVectorisedView(),
|
||||
})
|
||||
pkt.TransportHeader().Push(1)[0] = 0xFA
|
||||
var packetRoute stack.Route
|
||||
var packetRoute stack.RouteInfo
|
||||
packetRoute.RemoteAddress = dstIP
|
||||
endpoint.WritePacket(&packetRoute, nil /* gso */, ipv4.ProtocolNumber, pkt)
|
||||
endpoint.WritePacket(packetRoute, nil /* gso */, ipv4.ProtocolNumber, pkt)
|
||||
buf := make([]byte, 6500)
|
||||
bytesRead, err := sock.Read(buf)
|
||||
if err != nil {
|
||||
|
||||
@@ -113,12 +113,12 @@ func (e *Endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *Endpoint) WritePacket(r stack.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
return e.child.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *Endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
return e.child.WritePackets(r, gso, pkts, protocol)
|
||||
}
|
||||
|
||||
|
||||
@@ -35,15 +35,15 @@ func New(lower stack.LinkEndpoint) stack.LinkEndpoint {
|
||||
}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.WritePacket.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.Endpoint.DeliverOutboundPacket(r.RemoteLinkAddress(), r.LocalLinkAddress, protocol, pkt)
|
||||
func (e *endpoint) WritePacket(r stack.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.Endpoint.DeliverOutboundPacket(r.RemoteLinkAddress, r.LocalLinkAddress, protocol, pkt)
|
||||
return e.Endpoint.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
func (e *endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, proto tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, proto tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
e.Endpoint.DeliverOutboundPacket(r.RemoteLinkAddress(), r.LocalLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
e.Endpoint.DeliverOutboundPacket(r.RemoteLinkAddress, r.LocalLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
}
|
||||
|
||||
return e.Endpoint.WritePackets(r, gso, pkts, proto)
|
||||
|
||||
@@ -46,7 +46,7 @@ type Endpoint struct {
|
||||
}
|
||||
|
||||
// WritePacket implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WritePacket(r *stack.Route, _ *stack.GSO, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
func (e *Endpoint) WritePacket(r stack.RouteInfo, _ *stack.GSO, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if !e.linked.IsAttached() {
|
||||
return nil
|
||||
}
|
||||
@@ -55,7 +55,7 @@ func (e *Endpoint) WritePacket(r *stack.Route, _ *stack.GSO, proto tcpip.Network
|
||||
// remote address from the perspective of the other end of the pipe
|
||||
// (e.linked). Similarly, the remote address from the perspective of this
|
||||
// endpoint is the local address on the other end.
|
||||
e.linked.dispatcher.DeliverNetworkPacket(r.LocalLinkAddress /* remote */, r.RemoteLinkAddress() /* local */, proto, stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||
e.linked.dispatcher.DeliverNetworkPacket(r.LocalLinkAddress /* remote */, r.RemoteLinkAddress /* local */, proto, stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||
Data: buffer.NewVectorisedView(pkt.Size(), pkt.Views()),
|
||||
}))
|
||||
|
||||
@@ -63,7 +63,7 @@ func (e *Endpoint) WritePacket(r *stack.Route, _ *stack.GSO, proto tcpip.Network
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.
|
||||
func (*Endpoint) WritePackets(*stack.Route, *stack.GSO, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (*Endpoint) WritePackets(stack.RouteInfo, *stack.GSO, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -91,9 +91,8 @@ func (q *queueDispatcher) dispatchLoop() {
|
||||
}
|
||||
// We pass a protocol of zero here because each packet carries its
|
||||
// NetworkProtocol.
|
||||
q.lower.WritePackets(nil /* route */, nil /* gso */, batch, 0 /* protocol */)
|
||||
q.lower.WritePackets(stack.RouteInfo{}, nil /* gso */, batch, 0 /* protocol */)
|
||||
for pkt := batch.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
pkt.EgressRoute.Release()
|
||||
batch.Remove(pkt)
|
||||
}
|
||||
batch.Reset()
|
||||
@@ -151,7 +150,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.RouteInfo, 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.
|
||||
pkt.EgressRoute = r
|
||||
@@ -166,7 +165,7 @@ func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.Ne
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
func (e *endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
enqueued := 0
|
||||
for pkt := pkts.Front(); pkt != nil; {
|
||||
pkt.EgressRoute = r
|
||||
|
||||
@@ -61,7 +61,6 @@ func (q *packetBufferQueue) enqueue(s *stack.PacketBuffer) bool {
|
||||
q.mu.Lock()
|
||||
r := q.used < q.limit
|
||||
if r {
|
||||
s.EgressRoute.Acquire()
|
||||
q.list.PushBack(s)
|
||||
q.used++
|
||||
}
|
||||
|
||||
@@ -203,8 +203,8 @@ func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.Net
|
||||
|
||||
// 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 {
|
||||
e.AddHeader(r.LocalLinkAddress, r.RemoteLinkAddress(), protocol, pkt)
|
||||
func (e *endpoint) WritePacket(r stack.RouteInfo, _ *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.AddHeader(r.LocalLinkAddress, r.RemoteLinkAddress, protocol, pkt)
|
||||
|
||||
views := pkt.Views()
|
||||
// Transmit the packet.
|
||||
@@ -220,7 +220,7 @@ func (e *endpoint) WritePacket(r *stack.Route, _ *stack.GSO, protocol tcpip.Netw
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
func (e *endpoint) WritePackets(r *stack.Route, _ *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (*endpoint) WritePackets(stack.RouteInfo, *stack.GSO, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -260,8 +260,8 @@ func TestSimpleSend(t *testing.T) {
|
||||
defer c.cleanup()
|
||||
|
||||
// Prepare route.
|
||||
var r stack.Route
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
for iters := 1000; iters > 0; iters-- {
|
||||
func() {
|
||||
@@ -281,7 +281,7 @@ func TestSimpleSend(t *testing.T) {
|
||||
copy(pkt.NetworkHeader().Push(hdrLen), hdrBuf)
|
||||
|
||||
proto := tcpip.NetworkProtocolNumber(rand.Intn(0x10000))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, proto, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -340,9 +340,9 @@ func TestPreserveSrcAddressInSend(t *testing.T) {
|
||||
|
||||
newLocalLinkAddress := tcpip.LinkAddress(strings.Repeat("0xFE", 6))
|
||||
// Set both remote and local link address in route.
|
||||
var r stack.Route
|
||||
var r stack.RouteInfo
|
||||
r.LocalLinkAddress = newLocalLinkAddress
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||
// WritePacket panics given a prependable with anything less than
|
||||
@@ -351,7 +351,7 @@ func TestPreserveSrcAddressInSend(t *testing.T) {
|
||||
})
|
||||
|
||||
proto := tcpip.NetworkProtocolNumber(rand.Intn(0x10000))
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, proto, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, proto, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -393,8 +393,8 @@ func TestFillTxQueue(t *testing.T) {
|
||||
defer c.cleanup()
|
||||
|
||||
// Prepare to send a packet.
|
||||
var r stack.Route
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
buf := buffer.NewView(100)
|
||||
|
||||
@@ -407,7 +407,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
|
||||
@@ -425,7 +425,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
t.Fatalf("WritePacket return unexpected result: got %v, want %v", err, want)
|
||||
}
|
||||
}
|
||||
@@ -441,8 +441,8 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
c.txq.rx.Flush()
|
||||
|
||||
// Prepare to send a packet.
|
||||
var r stack.Route
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
buf := buffer.NewView(100)
|
||||
|
||||
@@ -452,7 +452,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -475,7 +475,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
|
||||
@@ -493,7 +493,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
t.Fatalf("WritePacket return unexpected result: got %v, want %v", err, want)
|
||||
}
|
||||
}
|
||||
@@ -505,8 +505,8 @@ func TestFillTxMemory(t *testing.T) {
|
||||
defer c.cleanup()
|
||||
|
||||
// Prepare to send a packet.
|
||||
var r stack.Route
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
buf := buffer.NewView(100)
|
||||
|
||||
@@ -518,7 +518,7 @@ func TestFillTxMemory(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
|
||||
@@ -537,7 +537,7 @@ func TestFillTxMemory(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt)
|
||||
err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt)
|
||||
if want := tcpip.ErrWouldBlock; err != want {
|
||||
t.Fatalf("WritePacket return unexpected result: got %v, want %v", err, want)
|
||||
}
|
||||
@@ -552,8 +552,8 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
defer c.cleanup()
|
||||
|
||||
// Prepare to send a packet.
|
||||
var r stack.Route
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
var r stack.RouteInfo
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
|
||||
buf := buffer.NewView(100)
|
||||
|
||||
@@ -564,7 +564,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
|
||||
@@ -579,7 +579,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buffer.NewView(bufferSize).ToVectorisedView(),
|
||||
})
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
if want, err := tcpip.ErrWouldBlock, c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != want {
|
||||
t.Fatalf("WritePacket return unexpected result: got %v, want %v", err, want)
|
||||
}
|
||||
}
|
||||
@@ -590,7 +590,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
ReserveHeaderBytes: int(c.ep.MaxHeaderLength()),
|
||||
Data: buf.ToVectorisedView(),
|
||||
})
|
||||
if err := c.ep.WritePacket(&r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
if err := c.ep.WritePacket(r, nil /* gso */, header.IPv4ProtocolNumber, pkt); err != nil {
|
||||
t.Fatalf("WritePacket failed unexpectedly: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ func (e *endpoint) dumpPacket(dir direction, 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 {
|
||||
func (e *endpoint) WritePacket(r stack.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
e.dumpPacket(directionSend, gso, protocol, pkt)
|
||||
return e.Endpoint.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
@@ -195,7 +195,7 @@ func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.Ne
|
||||
// WritePackets 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) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
e.dumpPacket(directionSend, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -108,7 +108,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.RouteInfo, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if !e.writeGate.Enter() {
|
||||
return nil
|
||||
}
|
||||
@@ -121,7 +121,7 @@ func (e *Endpoint) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.Ne
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets. 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) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *Endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
if !e.writeGate.Enter() {
|
||||
return pkts.Len(), nil
|
||||
}
|
||||
|
||||
@@ -69,13 +69,13 @@ 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(stack.RouteInfo, *stack.GSO, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) *tcpip.Error {
|
||||
e.writeCount++
|
||||
return nil
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
func (e *countedEndpoint) WritePackets(r *stack.Route, _ *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (e *countedEndpoint) WritePackets(_ stack.RouteInfo, _ *stack.GSO, pkts stack.PacketBufferList, _ tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
e.writeCount += pkts.Len()
|
||||
return pkts.Len(), nil
|
||||
}
|
||||
@@ -98,21 +98,21 @@ func TestWaitWrite(t *testing.T) {
|
||||
wep := New(ep)
|
||||
|
||||
// Write and check that it goes through.
|
||||
wep.WritePacket(nil, nil /* gso */, 0, stack.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
wep.WritePacket(stack.RouteInfo{}, nil /* gso */, 0, stack.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
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.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
wep.WritePacket(stack.RouteInfo{}, nil /* gso */, 0, stack.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
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.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
wep.WritePacket(stack.RouteInfo{}, nil /* gso */, 0, stack.NewPacketBuffer(stack.PacketBufferOptions{}))
|
||||
if want := 2; ep.writeCount != want {
|
||||
t.Fatalf("Unexpected writeCount: got=%v, want=%v", ep.writeCount, want)
|
||||
}
|
||||
|
||||
@@ -560,15 +560,23 @@ func (*testInterface) Promiscuous() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
return t.LinkEndpoint.WritePacket(r.Fields(), gso, protocol, pkt)
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
return t.LinkEndpoint.WritePackets(r.Fields(), gso, pkts, protocol)
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if t.writeErr != nil {
|
||||
return t.writeErr
|
||||
}
|
||||
|
||||
var r stack.Route
|
||||
var r stack.RouteInfo
|
||||
r.NetProto = protocol
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
return t.LinkEndpoint.WritePacket(&r, gso, protocol, pkt)
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
return t.LinkEndpoint.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
func TestLinkAddressRequest(t *testing.T) {
|
||||
|
||||
@@ -77,7 +77,7 @@ func (*stubLinkEndpoint) LinkAddress() tcpip.LinkAddress {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (*stubLinkEndpoint) WritePacket(*stack.Route, *stack.GSO, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) *tcpip.Error {
|
||||
func (*stubLinkEndpoint) WritePacket(stack.RouteInfo, *stack.GSO, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) *tcpip.Error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -148,11 +148,19 @@ func (*testInterface) Promiscuous() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePacket(r *stack.Route, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
return t.LinkEndpoint.WritePacket(r.Fields(), gso, protocol, pkt)
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
return t.LinkEndpoint.WritePackets(r.Fields(), gso, pkts, protocol)
|
||||
}
|
||||
|
||||
func (t *testInterface) WritePacketToRemote(remoteLinkAddr tcpip.LinkAddress, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
var r stack.Route
|
||||
var r stack.RouteInfo
|
||||
r.NetProto = protocol
|
||||
r.ResolveWith(remoteLinkAddr)
|
||||
return t.LinkEndpoint.WritePacket(&r, gso, protocol, pkt)
|
||||
r.RemoteLinkAddress = remoteLinkAddr
|
||||
return t.LinkEndpoint.WritePacket(r, gso, protocol, pkt)
|
||||
}
|
||||
|
||||
func TestICMPCounts(t *testing.T) {
|
||||
|
||||
@@ -62,7 +62,7 @@ func (*MockLinkEndpoint) MaxHeaderLength() uint16 { return 0 }
|
||||
func (*MockLinkEndpoint) LinkAddress() tcpip.LinkAddress { return "" }
|
||||
|
||||
// WritePacket implements LinkEndpoint.WritePacket.
|
||||
func (ep *MockLinkEndpoint) WritePacket(_ *stack.Route, _ *stack.GSO, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
func (ep *MockLinkEndpoint) WritePacket(_ stack.RouteInfo, _ *stack.GSO, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
if ep.allowPackets == 0 {
|
||||
return ep.err
|
||||
}
|
||||
@@ -72,7 +72,7 @@ func (ep *MockLinkEndpoint) WritePacket(_ *stack.Route, _ *stack.GSO, _ tcpip.Ne
|
||||
}
|
||||
|
||||
// WritePackets implements LinkEndpoint.WritePackets.
|
||||
func (ep *MockLinkEndpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
func (ep *MockLinkEndpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
var n int
|
||||
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user