mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Support for receiving outbound packets in AF_PACKET.
Updates #173 PiperOrigin-RevId: 322665518
This commit is contained in:
committed by
gVisor bot
parent
13c0cca50e
commit
71bf90c55b
@@ -134,6 +134,15 @@ const (
|
||||
SHUT_RDWR = 2
|
||||
)
|
||||
|
||||
// Packet types from <linux/if_packet.h>
|
||||
const (
|
||||
PACKET_HOST = 0 // To us
|
||||
PACKET_BROADCAST = 1 // To all
|
||||
PACKET_MULTICAST = 2 // To group
|
||||
PACKET_OTHERHOST = 3 // To someone else
|
||||
PACKET_OUTGOING = 4 // Outgoing of any type
|
||||
)
|
||||
|
||||
// Socket options from socket.h.
|
||||
const (
|
||||
SO_DEBUG = 1
|
||||
|
||||
@@ -26,6 +26,7 @@ package netstack
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"reflect"
|
||||
@@ -2468,6 +2469,23 @@ func (s *socketOpsCommon) fillCmsgInq(cmsg *socket.ControlMessages) {
|
||||
cmsg.IP.Inq = int32(len(s.readView) + rcvBufUsed)
|
||||
}
|
||||
|
||||
func toLinuxPacketType(pktType tcpip.PacketType) uint8 {
|
||||
switch pktType {
|
||||
case tcpip.PacketHost:
|
||||
return linux.PACKET_HOST
|
||||
case tcpip.PacketOtherHost:
|
||||
return linux.PACKET_OTHERHOST
|
||||
case tcpip.PacketOutgoing:
|
||||
return linux.PACKET_OUTGOING
|
||||
case tcpip.PacketBroadcast:
|
||||
return linux.PACKET_BROADCAST
|
||||
case tcpip.PacketMulticast:
|
||||
return linux.PACKET_MULTICAST
|
||||
default:
|
||||
panic(fmt.Sprintf("unknown packet type: %d", pktType))
|
||||
}
|
||||
}
|
||||
|
||||
// nonBlockingRead issues a non-blocking read.
|
||||
//
|
||||
// TODO(b/78348848): Support timestamps for stream sockets.
|
||||
@@ -2526,6 +2544,7 @@ func (s *socketOpsCommon) nonBlockingRead(ctx context.Context, dst usermem.IOSeq
|
||||
switch v := addr.(type) {
|
||||
case *linux.SockAddrLink:
|
||||
v.Protocol = htons(uint16(s.linkPacketInfo.Protocol))
|
||||
v.PacketType = toLinuxPacketType(s.linkPacketInfo.PktType)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -302,3 +302,7 @@ func (e *Endpoint) RemoveNotify(handle *NotificationHandle) {
|
||||
func (*Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return header.ARPHardwareNone
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *Endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
}
|
||||
|
||||
@@ -386,26 +386,33 @@ const (
|
||||
_VIRTIO_NET_HDR_GSO_TCPV6 = 4
|
||||
)
|
||||
|
||||
// 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 {
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
if e.hdrSize > 0 {
|
||||
// Add ethernet header if needed.
|
||||
eth := header.Ethernet(pkt.Header.Prepend(header.EthernetMinimumSize))
|
||||
pkt.LinkHeader = buffer.View(eth)
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: r.RemoteLinkAddress,
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if r.LocalLinkAddress != "" {
|
||||
ethHdr.SrcAddr = r.LocalLinkAddress
|
||||
if local != "" {
|
||||
ethHdr.SrcAddr = local
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
}
|
||||
}
|
||||
|
||||
// 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 {
|
||||
if e.hdrSize > 0 {
|
||||
e.AddHeader(r.LocalLinkAddress, r.RemoteLinkAddress, protocol, pkt)
|
||||
}
|
||||
|
||||
var builder iovec.Builder
|
||||
|
||||
@@ -448,22 +455,8 @@ func (e *endpoint) sendBatch(batchFD int, batch []*stack.PacketBuffer) (int, *tc
|
||||
// Send a batch of packets through batchFD.
|
||||
mmsgHdrs := make([]rawfile.MMsgHdr, 0, len(batch))
|
||||
for _, pkt := range batch {
|
||||
var eth header.Ethernet
|
||||
if e.hdrSize > 0 {
|
||||
// Add ethernet header if needed.
|
||||
eth = make(header.Ethernet, header.EthernetMinimumSize)
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
}
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if pkt.EgressRoute.LocalLinkAddress != "" {
|
||||
ethHdr.SrcAddr = pkt.EgressRoute.LocalLinkAddress
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
e.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
}
|
||||
|
||||
var vnetHdrBuf []byte
|
||||
@@ -493,7 +486,6 @@ func (e *endpoint) sendBatch(batchFD int, batch []*stack.PacketBuffer) (int, *tc
|
||||
|
||||
var builder iovec.Builder
|
||||
builder.Add(vnetHdrBuf)
|
||||
builder.Add(eth)
|
||||
builder.Add(pkt.Header.View())
|
||||
for _, v := range pkt.Data.Views() {
|
||||
builder.Add(v)
|
||||
|
||||
@@ -107,6 +107,10 @@ func (c *context) DeliverNetworkPacket(remote tcpip.LinkAddress, local tcpip.Lin
|
||||
c.ch <- packetInfo{remote, protocol, pkt}
|
||||
}
|
||||
|
||||
func (c *context) DeliverOutboundPacket(remote tcpip.LinkAddress, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func TestNoEthernetProperties(t *testing.T) {
|
||||
c := newContext(t, &Options{MTU: mtu})
|
||||
defer c.cleanup()
|
||||
@@ -510,6 +514,10 @@ func (d *fakeNetworkDispatcher) DeliverNetworkPacket(remote, local tcpip.LinkAdd
|
||||
d.pkts = append(d.pkts, pkt)
|
||||
}
|
||||
|
||||
func (d *fakeNetworkDispatcher) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func TestDispatchPacketFormat(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
|
||||
@@ -118,3 +118,6 @@ func (e *endpoint) WriteRawPacket(vv buffer.VectorisedView) *tcpip.Error {
|
||||
func (*endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return header.ARPHardwareLoopback
|
||||
}
|
||||
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
}
|
||||
|
||||
@@ -135,6 +135,10 @@ func (*InjectableEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
panic("unsupported operation")
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (*InjectableEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
}
|
||||
|
||||
// NewInjectableEndpoint creates a new multi-endpoint injectable endpoint.
|
||||
func NewInjectableEndpoint(routes map[tcpip.Address]stack.InjectableLinkEndpoint) *InjectableEndpoint {
|
||||
return &InjectableEndpoint{
|
||||
|
||||
@@ -61,6 +61,16 @@ func (e *Endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protoco
|
||||
}
|
||||
}
|
||||
|
||||
// DeliverOutboundPacket implements stack.NetworkDispatcher.DeliverOutboundPacket.
|
||||
func (e *Endpoint) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.mu.RLock()
|
||||
d := e.dispatcher
|
||||
e.mu.RUnlock()
|
||||
if d != nil {
|
||||
d.DeliverOutboundPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
}
|
||||
|
||||
// Attach implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) Attach(dispatcher stack.NetworkDispatcher) {
|
||||
e.mu.Lock()
|
||||
@@ -135,3 +145,8 @@ func (e *Endpoint) GSOMaxSize() uint32 {
|
||||
func (e *Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return e.child.ARPHardwareType()
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *Endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.child.AddHeader(local, remote, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -55,6 +55,10 @@ func (d *counterDispatcher) DeliverNetworkPacket(tcpip.LinkAddress, tcpip.LinkAd
|
||||
d.count++
|
||||
}
|
||||
|
||||
func (d *counterDispatcher) DeliverOutboundPacket(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func TestNestedLinkEndpoint(t *testing.T) {
|
||||
const emptyAddress = tcpip.LinkAddress("")
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
load("//tools:defs.bzl", "go_library")
|
||||
|
||||
package(licenses = ["notice"])
|
||||
|
||||
go_library(
|
||||
name = "packetsocket",
|
||||
srcs = ["endpoint.go"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//pkg/tcpip",
|
||||
"//pkg/tcpip/link/nested",
|
||||
"//pkg/tcpip/stack",
|
||||
],
|
||||
)
|
||||
@@ -0,0 +1,50 @@
|
||||
// Copyright 2020 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Package packetsocket provides a link layer endpoint that provides the ability
|
||||
// to loop outbound packets to any AF_PACKET sockets that may be interested in
|
||||
// the outgoing packet.
|
||||
package packetsocket
|
||||
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/nested"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||
)
|
||||
|
||||
type endpoint struct {
|
||||
nested.Endpoint
|
||||
}
|
||||
|
||||
// New creates a new packetsocket LinkEndpoint.
|
||||
func New(lower stack.LinkEndpoint) stack.LinkEndpoint {
|
||||
e := &endpoint{}
|
||||
e.Endpoint.Init(lower, e)
|
||||
return e
|
||||
}
|
||||
|
||||
// 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)
|
||||
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) {
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
e.Endpoint.DeliverOutboundPacket(pkt.EgressRoute.RemoteLinkAddress, pkt.EgressRoute.LocalLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
}
|
||||
|
||||
return e.Endpoint.WritePackets(r, gso, pkts, proto)
|
||||
}
|
||||
@@ -107,6 +107,11 @@ func (e *endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protoco
|
||||
e.dispatcher.DeliverNetworkPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
// DeliverOutboundPacket implements stack.NetworkDispatcher.DeliverOutboundPacket.
|
||||
func (e *endpoint) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.dispatcher.DeliverOutboundPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
// Attach implements stack.LinkEndpoint.Attach.
|
||||
func (e *endpoint) Attach(dispatcher stack.NetworkDispatcher) {
|
||||
e.dispatcher = dispatcher
|
||||
@@ -194,6 +199,8 @@ func (e *endpoint) WritePackets(_ *stack.Route, _ *stack.GSO, pkts stack.PacketB
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.WriteRawPacket.
|
||||
func (e *endpoint) WriteRawPacket(vv buffer.VectorisedView) *tcpip.Error {
|
||||
// TODO(gvisor.dev/issue/3267/): Queue these packets as well once
|
||||
// WriteRawPacket takes PacketBuffer instead of VectorisedView.
|
||||
return e.lower.WriteRawPacket(vv)
|
||||
}
|
||||
|
||||
@@ -213,3 +220,8 @@ func (e *endpoint) Wait() {
|
||||
func (e *endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return e.lower.ARPHardwareType()
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.lower.AddHeader(local, remote, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -183,22 +183,29 @@ func (e *endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
return e.addr
|
||||
}
|
||||
|
||||
// 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 {
|
||||
// Add the ethernet header here.
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
// Add ethernet header if needed.
|
||||
eth := header.Ethernet(pkt.Header.Prepend(header.EthernetMinimumSize))
|
||||
pkt.LinkHeader = buffer.View(eth)
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: r.RemoteLinkAddress,
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
if r.LocalLinkAddress != "" {
|
||||
ethHdr.SrcAddr = r.LocalLinkAddress
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if local != "" {
|
||||
ethHdr.SrcAddr = local
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
}
|
||||
|
||||
// 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)
|
||||
|
||||
v := pkt.Data.ToView()
|
||||
// Transmit the packet.
|
||||
|
||||
@@ -143,6 +143,10 @@ func (c *testContext) DeliverNetworkPacket(remoteLinkAddr, localLinkAddr tcpip.L
|
||||
c.packetCh <- struct{}{}
|
||||
}
|
||||
|
||||
func (c *testContext) DeliverOutboundPacket(remoteLinkAddr, localLinkAddr tcpip.LinkAddress, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (c *testContext) cleanup() {
|
||||
c.ep.Close()
|
||||
closeFDs(&c.txCfg)
|
||||
|
||||
@@ -123,6 +123,11 @@ func (e *endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protoco
|
||||
e.Endpoint.DeliverNetworkPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
// DeliverOutboundPacket implements stack.NetworkDispatcher.DeliverOutboundPacket.
|
||||
func (e *endpoint) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.Endpoint.DeliverOutboundPacket(remote, local, protocol, pkt)
|
||||
}
|
||||
|
||||
func (e *endpoint) dumpPacket(prefix string, gso *stack.GSO, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
writer := e.writer
|
||||
if writer == nil && atomic.LoadUint32(&LogPackets) == 1 {
|
||||
|
||||
@@ -272,21 +272,9 @@ func (d *Device) encodePkt(info *channel.PacketInfo) (buffer.View, bool) {
|
||||
if d.hasFlags(linux.IFF_TAP) {
|
||||
// Add ethernet header if not provided.
|
||||
if info.Pkt.LinkHeader == nil {
|
||||
hdr := &header.EthernetFields{
|
||||
SrcAddr: info.Route.LocalLinkAddress,
|
||||
DstAddr: info.Route.RemoteLinkAddress,
|
||||
Type: info.Proto,
|
||||
}
|
||||
if hdr.SrcAddr == "" {
|
||||
hdr.SrcAddr = d.endpoint.LinkAddress()
|
||||
}
|
||||
|
||||
eth := make(header.Ethernet, header.EthernetMinimumSize)
|
||||
eth.Encode(hdr)
|
||||
vv.AppendView(buffer.View(eth))
|
||||
} else {
|
||||
vv.AppendView(info.Pkt.LinkHeader)
|
||||
d.endpoint.AddHeader(info.Route.LocalLinkAddress, info.Route.RemoteLinkAddress, info.Proto, info.Pkt)
|
||||
}
|
||||
vv.AppendView(info.Pkt.LinkHeader)
|
||||
}
|
||||
|
||||
// Append upper headers.
|
||||
@@ -366,3 +354,30 @@ func (e *tunEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
return header.ARPHardwareNone
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *tunEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
if !e.isTap {
|
||||
return
|
||||
}
|
||||
eth := header.Ethernet(pkt.Header.Prepend(header.EthernetMinimumSize))
|
||||
pkt.LinkHeader = buffer.View(eth)
|
||||
hdr := &header.EthernetFields{
|
||||
SrcAddr: local,
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
if hdr.SrcAddr == "" {
|
||||
hdr.SrcAddr = e.LinkAddress()
|
||||
}
|
||||
|
||||
eth.Encode(hdr)
|
||||
}
|
||||
|
||||
// MaxHeaderLength returns the maximum size of the link layer header.
|
||||
func (e *tunEndpoint) MaxHeaderLength() uint16 {
|
||||
if e.isTap {
|
||||
return header.EthernetMinimumSize
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -60,6 +60,15 @@ func (e *Endpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protoco
|
||||
e.dispatchGate.Leave()
|
||||
}
|
||||
|
||||
// DeliverOutboundPacket implements stack.NetworkDispatcher.DeliverOutboundPacket.
|
||||
func (e *Endpoint) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
if !e.dispatchGate.Enter() {
|
||||
return
|
||||
}
|
||||
e.dispatcher.DeliverOutboundPacket(remote, local, protocol, pkt)
|
||||
e.dispatchGate.Leave()
|
||||
}
|
||||
|
||||
// Attach implements stack.LinkEndpoint.Attach. It saves the dispatcher and
|
||||
// registers with the lower endpoint as its dispatcher so that "e" is called
|
||||
// for inbound packets.
|
||||
@@ -153,3 +162,8 @@ func (e *Endpoint) Wait() {}
|
||||
func (e *Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return e.lower.ARPHardwareType()
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *Endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.lower.AddHeader(local, remote, protocol, pkt)
|
||||
}
|
||||
|
||||
@@ -40,6 +40,10 @@ func (e *countedEndpoint) DeliverNetworkPacket(remote, local tcpip.LinkAddress,
|
||||
e.dispatchCount++
|
||||
}
|
||||
|
||||
func (e *countedEndpoint) DeliverOutboundPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (e *countedEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
|
||||
e.attachCount++
|
||||
e.dispatcher = dispatcher
|
||||
@@ -90,6 +94,11 @@ func (*countedEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
// Wait implements stack.LinkEndpoint.Wait.
|
||||
func (*countedEndpoint) Wait() {}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *countedEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func TestWaitWrite(t *testing.T) {
|
||||
ep := &countedEndpoint{}
|
||||
wep := New(ep)
|
||||
|
||||
@@ -185,6 +185,11 @@ func (*testObject) ARPHardwareType() header.ARPHardwareType {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (*testObject) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
func buildIPv4Route(local, remote tcpip.Address) (stack.Route, *tcpip.Error) {
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{ipv4.NewProtocol()},
|
||||
|
||||
@@ -307,6 +307,11 @@ func (*fwdTestLinkEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *fwdTestLinkEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
func fwdTestNetFactory(t *testing.T, proto *fwdTestNetworkProtocol) (ep1, ep2 *fwdTestLinkEndpoint) {
|
||||
// Create a stack with the network protocol and two NICs.
|
||||
s := New(Options{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user