mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Remove ARP address workaround
- Make AddressableEndpoint optional for NetworkEndpoint. Not all NetworkEndpoints need to support addressing (e.g. ARP), so AddressableEndpoint should only be implemented for protocols that support addressing such as IPv4 and IPv6. With this change, tcpip.ErrNotSupported will be returned by the stack when attempting to modify addresses on a network endpoint that does not support addressing. Now that packets are fully handled at the network layer, and (with this change) addresses are optional for network endpoints, we no longer need the workaround for ARP where a fake ARP address was added to each NIC that performs ARP so that packets would be delivered to the ARP layer. PiperOrigin-RevId: 342722547
This commit is contained in:
committed by
gVisor bot
parent
373fd83100
commit
cc5cfce4c6
@@ -17,7 +17,6 @@ go_library(
|
||||
"//pkg/sentry/vfs",
|
||||
"//pkg/syserror",
|
||||
"//pkg/tcpip/link/tun",
|
||||
"//pkg/tcpip/network/arp",
|
||||
"//pkg/usermem",
|
||||
"//pkg/waiter",
|
||||
],
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
package tundev
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
@@ -28,7 +26,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/tun"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/network/arp"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
@@ -91,16 +88,7 @@ func (fd *tunFD) Ioctl(ctx context.Context, uio usermem.IO, args arch.SyscallArg
|
||||
return 0, err
|
||||
}
|
||||
flags := usermem.ByteOrder.Uint16(req.Data[:])
|
||||
created, err := fd.device.SetIff(stack.Stack, req.Name(), flags)
|
||||
if err == nil && created {
|
||||
// Always start with an ARP address for interfaces so they can handle ARP
|
||||
// packets.
|
||||
nicID := fd.device.NICID()
|
||||
if err := stack.Stack.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
panic(fmt.Sprintf("failed to add ARP address after creating new TUN/TAP interface with ID = %d", nicID))
|
||||
}
|
||||
}
|
||||
return 0, err
|
||||
return 0, fd.device.SetIff(stack.Stack, req.Name(), flags)
|
||||
|
||||
case linux.TUNGETIFF:
|
||||
var req linux.IFReq
|
||||
|
||||
@@ -34,7 +34,6 @@ go_library(
|
||||
"//pkg/sentry/socket/netstack",
|
||||
"//pkg/syserror",
|
||||
"//pkg/tcpip/link/tun",
|
||||
"//pkg/tcpip/network/arp",
|
||||
"//pkg/usermem",
|
||||
"//pkg/waiter",
|
||||
],
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
package dev
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
@@ -27,7 +25,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/netstack"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/tun"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/network/arp"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
@@ -112,16 +109,7 @@ func (n *netTunFileOperations) Ioctl(ctx context.Context, file *fs.File, io user
|
||||
return 0, err
|
||||
}
|
||||
flags := usermem.ByteOrder.Uint16(req.Data[:])
|
||||
created, err := n.device.SetIff(stack.Stack, req.Name(), flags)
|
||||
if err == nil && created {
|
||||
// Always start with an ARP address for interfaces so they can handle ARP
|
||||
// packets.
|
||||
nicID := n.device.NICID()
|
||||
if err := stack.Stack.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
panic(fmt.Sprintf("failed to add ARP address after creating new TUN/TAP interface with ID = %d", nicID))
|
||||
}
|
||||
}
|
||||
return 0, err
|
||||
return 0, n.device.SetIff(stack.Stack, req.Name(), flags)
|
||||
|
||||
case linux.TUNGETIFF:
|
||||
var req linux.IFReq
|
||||
|
||||
@@ -76,29 +76,13 @@ func (d *Device) Release(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
// NICID returns the NIC ID of the device.
|
||||
//
|
||||
// Must only be called after the device has been attached to an endpoint.
|
||||
func (d *Device) NICID() tcpip.NICID {
|
||||
d.mu.RLock()
|
||||
defer d.mu.RUnlock()
|
||||
|
||||
if d.endpoint == nil {
|
||||
panic("called NICID on a device that has not been attached")
|
||||
}
|
||||
|
||||
return d.endpoint.nicID
|
||||
}
|
||||
|
||||
// SetIff services TUNSETIFF ioctl(2) request.
|
||||
//
|
||||
// Returns true if a new NIC was created; false if an existing one was attached.
|
||||
func (d *Device) SetIff(s *stack.Stack, name string, flags uint16) (bool, error) {
|
||||
func (d *Device) SetIff(s *stack.Stack, name string, flags uint16) error {
|
||||
d.mu.Lock()
|
||||
defer d.mu.Unlock()
|
||||
|
||||
if d.endpoint != nil {
|
||||
return false, syserror.EINVAL
|
||||
return syserror.EINVAL
|
||||
}
|
||||
|
||||
// Input validations.
|
||||
@@ -106,7 +90,7 @@ func (d *Device) SetIff(s *stack.Stack, name string, flags uint16) (bool, error)
|
||||
isTap := flags&linux.IFF_TAP != 0
|
||||
supportedFlags := uint16(linux.IFF_TUN | linux.IFF_TAP | linux.IFF_NO_PI)
|
||||
if isTap && isTun || !isTap && !isTun || flags&^supportedFlags != 0 {
|
||||
return false, syserror.EINVAL
|
||||
return syserror.EINVAL
|
||||
}
|
||||
|
||||
prefix := "tun"
|
||||
@@ -119,18 +103,18 @@ func (d *Device) SetIff(s *stack.Stack, name string, flags uint16) (bool, error)
|
||||
linkCaps |= stack.CapabilityResolutionRequired
|
||||
}
|
||||
|
||||
endpoint, created, err := attachOrCreateNIC(s, name, prefix, linkCaps)
|
||||
endpoint, err := attachOrCreateNIC(s, name, prefix, linkCaps)
|
||||
if err != nil {
|
||||
return false, syserror.EINVAL
|
||||
return syserror.EINVAL
|
||||
}
|
||||
|
||||
d.endpoint = endpoint
|
||||
d.notifyHandle = d.endpoint.AddNotify(d)
|
||||
d.flags = flags
|
||||
return created, nil
|
||||
return nil
|
||||
}
|
||||
|
||||
func attachOrCreateNIC(s *stack.Stack, name, prefix string, linkCaps stack.LinkEndpointCapabilities) (*tunEndpoint, bool, error) {
|
||||
func attachOrCreateNIC(s *stack.Stack, name, prefix string, linkCaps stack.LinkEndpointCapabilities) (*tunEndpoint, error) {
|
||||
for {
|
||||
// 1. Try to attach to an existing NIC.
|
||||
if name != "" {
|
||||
@@ -138,13 +122,13 @@ func attachOrCreateNIC(s *stack.Stack, name, prefix string, linkCaps stack.LinkE
|
||||
endpoint, ok := linkEP.(*tunEndpoint)
|
||||
if !ok {
|
||||
// Not a NIC created by tun device.
|
||||
return nil, false, syserror.EOPNOTSUPP
|
||||
return nil, syserror.EOPNOTSUPP
|
||||
}
|
||||
if !endpoint.TryIncRef() {
|
||||
// Race detected: NIC got deleted in between.
|
||||
continue
|
||||
}
|
||||
return endpoint, false, nil
|
||||
return endpoint, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,12 +151,12 @@ func attachOrCreateNIC(s *stack.Stack, name, prefix string, linkCaps stack.LinkE
|
||||
})
|
||||
switch err {
|
||||
case nil:
|
||||
return endpoint, true, nil
|
||||
return endpoint, nil
|
||||
case tcpip.ErrDuplicateNICID:
|
||||
// Race detected: A NIC has been created in between.
|
||||
continue
|
||||
default:
|
||||
return nil, false, syserror.EINVAL
|
||||
return nil, syserror.EINVAL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,17 +31,15 @@ import (
|
||||
const (
|
||||
// ProtocolNumber is the ARP protocol number.
|
||||
ProtocolNumber = header.ARPProtocolNumber
|
||||
|
||||
// ProtocolAddress is the address expected by the ARP endpoint.
|
||||
ProtocolAddress = tcpip.Address("arp")
|
||||
)
|
||||
|
||||
var _ stack.AddressableEndpoint = (*endpoint)(nil)
|
||||
// ARP endpoints need to implement stack.NetworkEndpoint because the stack
|
||||
// considers the layer above the link-layer a network layer; the only
|
||||
// facility provided by the stack to deliver packets to a layer above
|
||||
// the link-layer is via stack.NetworkEndpoint.HandlePacket.
|
||||
var _ stack.NetworkEndpoint = (*endpoint)(nil)
|
||||
|
||||
type endpoint struct {
|
||||
stack.AddressableEndpointState
|
||||
|
||||
protocol *protocol
|
||||
|
||||
// enabled is set to 1 when the NIC is enabled and 0 when it is disabled.
|
||||
@@ -87,7 +85,7 @@ func (e *endpoint) Disable() {
|
||||
}
|
||||
|
||||
// DefaultTTL is unused for ARP. It implements stack.NetworkEndpoint.
|
||||
func (e *endpoint) DefaultTTL() uint8 {
|
||||
func (*endpoint) DefaultTTL() uint8 {
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -100,25 +98,23 @@ func (e *endpoint) MaxHeaderLength() uint16 {
|
||||
return e.nic.MaxHeaderLength() + header.ARPSize
|
||||
}
|
||||
|
||||
func (e *endpoint) Close() {
|
||||
e.AddressableEndpointState.Cleanup()
|
||||
}
|
||||
func (*endpoint) Close() {}
|
||||
|
||||
func (e *endpoint) WritePacket(*stack.Route, *stack.GSO, stack.NetworkHeaderParams, *stack.PacketBuffer) *tcpip.Error {
|
||||
func (*endpoint) WritePacket(*stack.Route, *stack.GSO, stack.NetworkHeaderParams, *stack.PacketBuffer) *tcpip.Error {
|
||||
return tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
// NetworkProtocolNumber implements stack.NetworkEndpoint.NetworkProtocolNumber.
|
||||
func (e *endpoint) NetworkProtocolNumber() tcpip.NetworkProtocolNumber {
|
||||
func (*endpoint) NetworkProtocolNumber() tcpip.NetworkProtocolNumber {
|
||||
return ProtocolNumber
|
||||
}
|
||||
|
||||
// WritePackets implements stack.NetworkEndpoint.WritePackets.
|
||||
func (e *endpoint) WritePackets(*stack.Route, *stack.GSO, stack.PacketBufferList, stack.NetworkHeaderParams) (int, *tcpip.Error) {
|
||||
func (*endpoint) WritePackets(*stack.Route, *stack.GSO, stack.PacketBufferList, stack.NetworkHeaderParams) (int, *tcpip.Error) {
|
||||
return 0, tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
func (e *endpoint) WriteHeaderIncludedPacket(r *stack.Route, pkt *stack.PacketBuffer) *tcpip.Error {
|
||||
func (*endpoint) WriteHeaderIncludedPacket(*stack.Route, *stack.PacketBuffer) *tcpip.Error {
|
||||
return tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
@@ -216,9 +212,8 @@ func (p *protocol) Number() tcpip.NetworkProtocolNumber { return ProtocolNumber
|
||||
func (p *protocol) MinimumPacketSize() int { return header.ARPSize }
|
||||
func (p *protocol) DefaultPrefixLen() int { return 0 }
|
||||
|
||||
func (*protocol) ParseAddresses(v buffer.View) (src, dst tcpip.Address) {
|
||||
h := header.ARP(v)
|
||||
return tcpip.Address(h.ProtocolAddressSender()), ProtocolAddress
|
||||
func (*protocol) ParseAddresses(buffer.View) (src, dst tcpip.Address) {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
func (p *protocol) NewEndpoint(nic stack.NetworkInterface, linkAddrCache stack.LinkAddressCache, nud stack.NUDHandler, dispatcher stack.TransportDispatcher) stack.NetworkEndpoint {
|
||||
@@ -228,7 +223,6 @@ func (p *protocol) NewEndpoint(nic stack.NetworkInterface, linkAddrCache stack.L
|
||||
linkAddrCache: linkAddrCache,
|
||||
nud: nud,
|
||||
}
|
||||
e.AddressableEndpointState.Init(e)
|
||||
return e
|
||||
}
|
||||
|
||||
@@ -311,10 +305,6 @@ func (*protocol) Parse(pkt *stack.PacketBuffer) (proto tcpip.TransportProtocolNu
|
||||
}
|
||||
|
||||
// NewProtocol returns an ARP network protocol.
|
||||
//
|
||||
// Note, to make sure that the ARP endpoint receives ARP packets, the "arp"
|
||||
// address must be added to every NIC that should respond to ARP requests. See
|
||||
// ProtocolAddress for more details.
|
||||
func NewProtocol(s *stack.Stack) stack.NetworkProtocol {
|
||||
return &protocol{stack: s}
|
||||
}
|
||||
|
||||
@@ -200,9 +200,6 @@ func newTestContext(t *testing.T, useNeighborCache bool) *testContext {
|
||||
t.Fatalf("AddAddress for ipv4 failed: %v", err)
|
||||
}
|
||||
}
|
||||
if err := s.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("AddAddress for arp failed: %v", err)
|
||||
}
|
||||
|
||||
s.SetRouteTable([]tcpip.Route{{
|
||||
Destination: header.IPv4EmptySubnet,
|
||||
|
||||
@@ -670,8 +670,12 @@ func TestReceive(t *testing.T) {
|
||||
t.Fatalf("ep.Enable(): %s", err)
|
||||
}
|
||||
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(test.epAddr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", test.epAddr, err)
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatalf("expected network endpoint with number = %d to implement stack.AddressableEndpoint", test.protoNum)
|
||||
}
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(test.epAddr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", test.epAddr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
@@ -778,9 +782,13 @@ func TestIPv4ReceiveControl(t *testing.T) {
|
||||
nic.testObject.typ = c.expectedTyp
|
||||
nic.testObject.extra = c.expectedExtra
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatal("expected IPv4 network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := localIPv4Addr.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
@@ -863,9 +871,13 @@ func TestIPv4FragmentationReceive(t *testing.T) {
|
||||
t.Fatalf("failed to parse packet: %x", pkt.Data.ToView())
|
||||
}
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatal("expected IPv4 network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := localIPv4Addr.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
@@ -1038,9 +1050,13 @@ func TestIPv6ReceiveControl(t *testing.T) {
|
||||
// Set ICMPv6 checksum.
|
||||
icmp.SetChecksum(header.ICMPv6Checksum(icmp, outerSrcAddr, localIPv6Addr, buffer.VectorisedView{}))
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatal("expected IPv6 network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := localIPv6Addr.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
|
||||
@@ -2712,9 +2712,6 @@ func TestPacketQueing(t *testing.T) {
|
||||
if err := s.CreateNIC(nicID, e); err != nil {
|
||||
t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err)
|
||||
}
|
||||
if err := s.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("s.AddAddress(%d, %d, %s): %s", nicID, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
if err := s.AddProtocolAddress(nicID, host1IPv4Addr); err != nil {
|
||||
t.Fatalf("s.AddProtocolAddress(%d, %#v): %s", nicID, host1IPv4Addr, err)
|
||||
}
|
||||
|
||||
@@ -205,9 +205,13 @@ func TestICMPCounts(t *testing.T) {
|
||||
t.Fatalf("ep.Enable(): %s", err)
|
||||
}
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatalf("expected network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := lladdr0.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
@@ -343,9 +347,13 @@ func TestICMPCountsWithNeighborCache(t *testing.T) {
|
||||
t.Fatalf("ep.Enable(): %s", err)
|
||||
}
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatalf("expected network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := lladdr0.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
@@ -1769,9 +1777,13 @@ func TestCallsToNeighborCache(t *testing.T) {
|
||||
t.Fatalf("ep.Enable(): %s", err)
|
||||
}
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatalf("expected network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := lladdr0.WithPrefix()
|
||||
if ep, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if ep, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
ep.DecRef()
|
||||
}
|
||||
|
||||
@@ -69,9 +69,13 @@ func setupStackAndEndpoint(t *testing.T, llladdr, rlladdr tcpip.Address, useNeig
|
||||
}
|
||||
t.Cleanup(ep.Close)
|
||||
|
||||
addressableEndpoint, ok := ep.(stack.AddressableEndpoint)
|
||||
if !ok {
|
||||
t.Fatalf("expected network endpoint to implement stack.AddressableEndpoint")
|
||||
}
|
||||
addr := llladdr.WithPrefix()
|
||||
if addressEP, err := ep.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("ep.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
if addressEP, err := addressableEndpoint.AddAndAcquirePermanentAddress(addr, stack.CanBePrimaryEndpoint, stack.AddressConfigStatic, false /* deprecated */); err != nil {
|
||||
t.Fatalf("addressableEndpoint.AddAndAcquirePermanentAddress(%s, CanBePrimaryEndpoint, AddressConfigStatic, false): %s", addr, err)
|
||||
} else {
|
||||
addressEP.DecRef()
|
||||
}
|
||||
|
||||
@@ -148,10 +148,6 @@ func main() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := s.AddAddress(1, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
subnet, err := tcpip.NewSubnet(tcpip.Address(strings.Repeat("\x00", len(addr))), tcpip.AddressMask(strings.Repeat("\x00", len(addr))))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
+49
-13
@@ -321,16 +321,21 @@ func (n *NIC) setSpoofing(enable bool) {
|
||||
// primaryAddress returns an address that can be used to communicate with
|
||||
// remoteAddr.
|
||||
func (n *NIC) primaryEndpoint(protocol tcpip.NetworkProtocolNumber, remoteAddr tcpip.Address) AssignableAddressEndpoint {
|
||||
n.mu.RLock()
|
||||
spoofing := n.mu.spoofing
|
||||
n.mu.RUnlock()
|
||||
|
||||
ep, ok := n.networkEndpoints[protocol]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ep.AcquireOutgoingPrimaryAddress(remoteAddr, spoofing)
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
n.mu.RLock()
|
||||
spoofing := n.mu.spoofing
|
||||
n.mu.RUnlock()
|
||||
|
||||
return addressableEndpoint.AcquireOutgoingPrimaryAddress(remoteAddr, spoofing)
|
||||
}
|
||||
|
||||
type getAddressBehaviour int
|
||||
@@ -389,11 +394,17 @@ func (n *NIC) getAddressOrCreateTemp(protocol tcpip.NetworkProtocolNumber, addre
|
||||
// getAddressOrCreateTempInner is like getAddressEpOrCreateTemp except a boolean
|
||||
// is passed to indicate whether or not we should generate temporary endpoints.
|
||||
func (n *NIC) getAddressOrCreateTempInner(protocol tcpip.NetworkProtocolNumber, address tcpip.Address, createTemp bool, peb PrimaryEndpointBehavior) AssignableAddressEndpoint {
|
||||
if ep, ok := n.networkEndpoints[protocol]; ok {
|
||||
return ep.AcquireAssignedAddress(address, createTemp, peb)
|
||||
ep, ok := n.networkEndpoints[protocol]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
return addressableEndpoint.AcquireAssignedAddress(address, createTemp, peb)
|
||||
}
|
||||
|
||||
// addAddress adds a new address to n, so that it starts accepting packets
|
||||
@@ -404,7 +415,12 @@ func (n *NIC) addAddress(protocolAddress tcpip.ProtocolAddress, peb PrimaryEndpo
|
||||
return tcpip.ErrUnknownProtocol
|
||||
}
|
||||
|
||||
addressEndpoint, err := ep.AddAndAcquirePermanentAddress(protocolAddress.AddressWithPrefix, peb, AddressConfigStatic, false /* deprecated */)
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
return tcpip.ErrNotSupported
|
||||
}
|
||||
|
||||
addressEndpoint, err := addressableEndpoint.AddAndAcquirePermanentAddress(protocolAddress.AddressWithPrefix, peb, AddressConfigStatic, false /* deprecated */)
|
||||
if err == nil {
|
||||
// We have no need for the address endpoint.
|
||||
addressEndpoint.DecRef()
|
||||
@@ -417,7 +433,12 @@ func (n *NIC) addAddress(protocolAddress tcpip.ProtocolAddress, peb PrimaryEndpo
|
||||
func (n *NIC) allPermanentAddresses() []tcpip.ProtocolAddress {
|
||||
var addrs []tcpip.ProtocolAddress
|
||||
for p, ep := range n.networkEndpoints {
|
||||
for _, a := range ep.PermanentAddresses() {
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, a := range addressableEndpoint.PermanentAddresses() {
|
||||
addrs = append(addrs, tcpip.ProtocolAddress{Protocol: p, AddressWithPrefix: a})
|
||||
}
|
||||
}
|
||||
@@ -428,7 +449,12 @@ func (n *NIC) allPermanentAddresses() []tcpip.ProtocolAddress {
|
||||
func (n *NIC) primaryAddresses() []tcpip.ProtocolAddress {
|
||||
var addrs []tcpip.ProtocolAddress
|
||||
for p, ep := range n.networkEndpoints {
|
||||
for _, a := range ep.PrimaryAddresses() {
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, a := range addressableEndpoint.PrimaryAddresses() {
|
||||
addrs = append(addrs, tcpip.ProtocolAddress{Protocol: p, AddressWithPrefix: a})
|
||||
}
|
||||
}
|
||||
@@ -446,13 +472,23 @@ func (n *NIC) primaryAddress(proto tcpip.NetworkProtocolNumber) tcpip.AddressWit
|
||||
return tcpip.AddressWithPrefix{}
|
||||
}
|
||||
|
||||
return ep.MainAddress()
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
return tcpip.AddressWithPrefix{}
|
||||
}
|
||||
|
||||
return addressableEndpoint.MainAddress()
|
||||
}
|
||||
|
||||
// removeAddress removes an address from n.
|
||||
func (n *NIC) removeAddress(addr tcpip.Address) *tcpip.Error {
|
||||
for _, ep := range n.networkEndpoints {
|
||||
if err := ep.RemovePermanentAddress(addr); err == tcpip.ErrBadLocalAddress {
|
||||
addressableEndpoint, ok := ep.(AddressableEndpoint)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := addressableEndpoint.RemovePermanentAddress(addr); err == tcpip.ErrBadLocalAddress {
|
||||
continue
|
||||
} else {
|
||||
return err
|
||||
|
||||
@@ -524,8 +524,6 @@ type NetworkInterface interface {
|
||||
// NetworkEndpoint is the interface that needs to be implemented by endpoints
|
||||
// of network layer protocols (e.g., ipv4, ipv6).
|
||||
type NetworkEndpoint interface {
|
||||
AddressableEndpoint
|
||||
|
||||
// Enable enables the endpoint.
|
||||
//
|
||||
// Must only be called when the stack is in a state that allows the endpoint
|
||||
|
||||
@@ -229,19 +229,6 @@ func TestForwarding(t *testing.T) {
|
||||
t.Fatalf("routerStack.SetForwarding(%d): %s", ipv6.ProtocolNumber, err)
|
||||
}
|
||||
|
||||
if err := host1Stack.AddAddress(host1NICID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("host1Stack.AddAddress(%d, %d, %s): %s", host1NICID, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
if err := routerStack.AddAddress(routerNICID1, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("routerStack.AddAddress(%d, %d, %s): %s", routerNICID1, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
if err := routerStack.AddAddress(routerNICID2, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("routerStack.AddAddress(%d, %d, %s): %s", routerNICID2, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
if err := host2Stack.AddAddress(host2NICID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("host2Stack.AddAddress(%d, %d, %s): %s", host2NICID, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
|
||||
if err := host1Stack.AddProtocolAddress(host1NICID, host1IPv4Addr); err != nil {
|
||||
t.Fatalf("host1Stack.AddProtocolAddress(%d, %#v): %s", host1NICID, host1IPv4Addr, err)
|
||||
}
|
||||
|
||||
@@ -140,13 +140,6 @@ func TestPing(t *testing.T) {
|
||||
t.Fatalf("host2Stack.CreateNIC(%d, _): %s", host2NICID, err)
|
||||
}
|
||||
|
||||
if err := host1Stack.AddAddress(host1NICID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("host1Stack.AddAddress(%d, %d, %s): %s", host1NICID, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
if err := host2Stack.AddAddress(host2NICID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
t.Fatalf("host2Stack.AddAddress(%d, %d, %s): %s", host2NICID, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
|
||||
if err := host1Stack.AddProtocolAddress(host1NICID, ipv4Addr1); err != nil {
|
||||
t.Fatalf("host1Stack.AddProtocolAddress(%d, %#v): %s", host1NICID, ipv4Addr1, err)
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/packetsocket"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/qdisc/fifo"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/sniffer"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/network/arp"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||
@@ -271,11 +270,6 @@ func (n *Network) createNICWithAddrs(id tcpip.NICID, name string, ep stack.LinkE
|
||||
return fmt.Errorf("CreateNICWithOptions(%d, _, %+v) failed: %v", id, opts, err)
|
||||
}
|
||||
|
||||
// Always start with an arp address for the NIC.
|
||||
if err := n.Stack.AddAddress(id, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
return fmt.Errorf("AddAddress(%v, %v, %v) failed: %v", id, arp.ProtocolNumber, arp.ProtocolAddress, err)
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
proto, tcpipAddr := ipToAddressAndProto(addr)
|
||||
if err := n.Stack.AddAddress(id, proto, tcpipAddr); err != nil {
|
||||
|
||||
@@ -208,9 +208,6 @@ func newNetstackImpl(mode string) (impl, error) {
|
||||
if err := s.CreateNIC(nicID, fifo.New(ep, runtime.GOMAXPROCS(0), 1000)); err != nil {
|
||||
return nil, fmt.Errorf("error creating NIC %q: %v", *iface, err)
|
||||
}
|
||||
if err := s.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
return nil, fmt.Errorf("error adding ARP address to %q: %v", *iface, err)
|
||||
}
|
||||
if err := s.AddAddress(nicID, ipv4.ProtocolNumber, parsedAddr); err != nil {
|
||||
return nil, fmt.Errorf("error adding IP address to %q: %v", *iface, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user