Don't support address ranges
Previously the netstack supported assignment of a range of addresses. This feature is not used so remove it. PiperOrigin-RevId: 326791119
This commit is contained in:
parent
1736b2208f
commit
9a7b5830aa
|
@ -51,13 +51,12 @@ type NIC struct {
|
|||
|
||||
mu struct {
|
||||
sync.RWMutex
|
||||
enabled bool
|
||||
spoofing bool
|
||||
promiscuous bool
|
||||
primary map[tcpip.NetworkProtocolNumber][]*referencedNetworkEndpoint
|
||||
endpoints map[NetworkEndpointID]*referencedNetworkEndpoint
|
||||
addressRanges []tcpip.Subnet
|
||||
mcastJoins map[NetworkEndpointID]uint32
|
||||
enabled bool
|
||||
spoofing bool
|
||||
promiscuous bool
|
||||
primary map[tcpip.NetworkProtocolNumber][]*referencedNetworkEndpoint
|
||||
endpoints map[NetworkEndpointID]*referencedNetworkEndpoint
|
||||
mcastJoins map[NetworkEndpointID]uint32
|
||||
// packetEPs is protected by mu, but the contained PacketEndpoint
|
||||
// values are not.
|
||||
packetEPs map[tcpip.NetworkProtocolNumber][]PacketEndpoint
|
||||
|
@ -670,25 +669,6 @@ func (n *NIC) getRefOrCreateTemp(protocol tcpip.NetworkProtocolNumber, address t
|
|||
// A usable reference was not found, create a temporary one if requested by
|
||||
// the caller or if the address is found in the NIC's subnets.
|
||||
createTempEP := spoofingOrPromiscuous
|
||||
if !createTempEP {
|
||||
for _, sn := range n.mu.addressRanges {
|
||||
// Skip the subnet address.
|
||||
if address == sn.ID() {
|
||||
continue
|
||||
}
|
||||
// For now just skip the broadcast address, until we support it.
|
||||
// FIXME(b/137608825): Add support for sending/receiving directed
|
||||
// (subnet) broadcast.
|
||||
if address == sn.Broadcast() {
|
||||
continue
|
||||
}
|
||||
if sn.Contains(address) {
|
||||
createTempEP = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
n.mu.RUnlock()
|
||||
|
||||
if !createTempEP {
|
||||
|
@ -982,38 +962,11 @@ func (n *NIC) primaryAddress(proto tcpip.NetworkProtocolNumber) tcpip.AddressWit
|
|||
return tcpip.AddressWithPrefix{}
|
||||
}
|
||||
|
||||
// AddAddressRange adds a range of addresses to n, so that it starts accepting
|
||||
// packets targeted at the given addresses and network protocol. The range is
|
||||
// given by a subnet address, and all addresses contained in the subnet are
|
||||
// used except for the subnet address itself and the subnet's broadcast
|
||||
// address.
|
||||
func (n *NIC) AddAddressRange(protocol tcpip.NetworkProtocolNumber, subnet tcpip.Subnet) {
|
||||
n.mu.Lock()
|
||||
n.mu.addressRanges = append(n.mu.addressRanges, subnet)
|
||||
n.mu.Unlock()
|
||||
}
|
||||
|
||||
// RemoveAddressRange removes the given address range from n.
|
||||
func (n *NIC) RemoveAddressRange(subnet tcpip.Subnet) {
|
||||
n.mu.Lock()
|
||||
|
||||
// Use the same underlying array.
|
||||
tmp := n.mu.addressRanges[:0]
|
||||
for _, sub := range n.mu.addressRanges {
|
||||
if sub != subnet {
|
||||
tmp = append(tmp, sub)
|
||||
}
|
||||
}
|
||||
n.mu.addressRanges = tmp
|
||||
|
||||
n.mu.Unlock()
|
||||
}
|
||||
|
||||
// AddressRanges returns the Subnets associated with this NIC.
|
||||
func (n *NIC) AddressRanges() []tcpip.Subnet {
|
||||
n.mu.RLock()
|
||||
defer n.mu.RUnlock()
|
||||
sns := make([]tcpip.Subnet, 0, len(n.mu.addressRanges)+len(n.mu.endpoints))
|
||||
sns := make([]tcpip.Subnet, 0, len(n.mu.endpoints))
|
||||
for nid := range n.mu.endpoints {
|
||||
sn, err := tcpip.NewSubnet(nid.LocalAddress, tcpip.AddressMask(strings.Repeat("\xff", len(nid.LocalAddress))))
|
||||
if err != nil {
|
||||
|
@ -1023,7 +976,7 @@ func (n *NIC) AddressRanges() []tcpip.Subnet {
|
|||
}
|
||||
sns = append(sns, sn)
|
||||
}
|
||||
return append(sns, n.mu.addressRanges...)
|
||||
return sns
|
||||
}
|
||||
|
||||
// insertPrimaryEndpointLocked adds r to n's primary endpoint list as required
|
||||
|
|
|
@ -1230,35 +1230,6 @@ func (s *Stack) AddProtocolAddressWithOptions(id tcpip.NICID, protocolAddress tc
|
|||
return nic.AddAddress(protocolAddress, peb)
|
||||
}
|
||||
|
||||
// AddAddressRange adds a range of addresses to the specified NIC. The range is
|
||||
// given by a subnet address, and all addresses contained in the subnet are
|
||||
// used except for the subnet address itself and the subnet's broadcast
|
||||
// address.
|
||||
func (s *Stack) AddAddressRange(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber, subnet tcpip.Subnet) *tcpip.Error {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
if nic, ok := s.nics[id]; ok {
|
||||
nic.AddAddressRange(protocol, subnet)
|
||||
return nil
|
||||
}
|
||||
|
||||
return tcpip.ErrUnknownNICID
|
||||
}
|
||||
|
||||
// RemoveAddressRange removes the range of addresses from the specified NIC.
|
||||
func (s *Stack) RemoveAddressRange(id tcpip.NICID, subnet tcpip.Subnet) *tcpip.Error {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
if nic, ok := s.nics[id]; ok {
|
||||
nic.RemoveAddressRange(subnet)
|
||||
return nil
|
||||
}
|
||||
|
||||
return tcpip.ErrUnknownNICID
|
||||
}
|
||||
|
||||
// RemoveAddress removes an existing network-layer address from the specified
|
||||
// NIC.
|
||||
func (s *Stack) RemoveAddress(id tcpip.NICID, addr tcpip.Address) *tcpip.Error {
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
"math"
|
||||
"net"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
|
@ -1641,149 +1640,6 @@ func TestMulticastOrIPv6LinkLocalNeedsNoRoute(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// Add a range of addresses, then check that a packet is delivered.
|
||||
func TestAddressRangeAcceptsMatchingPacket(t *testing.T) {
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()},
|
||||
})
|
||||
|
||||
ep := channel.New(10, defaultMTU, "")
|
||||
if err := s.CreateNIC(1, ep); err != nil {
|
||||
t.Fatal("CreateNIC failed:", err)
|
||||
}
|
||||
|
||||
{
|
||||
subnet, err := tcpip.NewSubnet("\x00", "\x00")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: 1}})
|
||||
}
|
||||
|
||||
fakeNet := s.NetworkProtocolInstance(fakeNetNumber).(*fakeNetworkProtocol)
|
||||
|
||||
buf := buffer.NewView(30)
|
||||
|
||||
const localAddrByte byte = 0x01
|
||||
buf[dstAddrOffset] = localAddrByte
|
||||
subnet, err := tcpip.NewSubnet(tcpip.Address("\x00"), tcpip.AddressMask("\xF0"))
|
||||
if err != nil {
|
||||
t.Fatal("NewSubnet failed:", err)
|
||||
}
|
||||
if err := s.AddAddressRange(1, fakeNetNumber, subnet); err != nil {
|
||||
t.Fatal("AddAddressRange failed:", err)
|
||||
}
|
||||
|
||||
testRecv(t, fakeNet, localAddrByte, ep, buf)
|
||||
}
|
||||
|
||||
func testNicForAddressRange(t *testing.T, nicID tcpip.NICID, s *stack.Stack, subnet tcpip.Subnet, rangeExists bool) {
|
||||
t.Helper()
|
||||
|
||||
// Loop over all addresses and check them.
|
||||
numOfAddresses := 1 << uint(8-subnet.Prefix())
|
||||
if numOfAddresses < 1 || numOfAddresses > 255 {
|
||||
t.Fatalf("got numOfAddresses = %d, want = [1 .. 255] (subnet=%s)", numOfAddresses, subnet)
|
||||
}
|
||||
|
||||
addrBytes := []byte(subnet.ID())
|
||||
for i := 0; i < numOfAddresses; i++ {
|
||||
addr := tcpip.Address(addrBytes)
|
||||
wantNicID := nicID
|
||||
// The subnet and broadcast addresses are skipped.
|
||||
if !rangeExists || addr == subnet.ID() || addr == subnet.Broadcast() {
|
||||
wantNicID = 0
|
||||
}
|
||||
if gotNicID := s.CheckLocalAddress(0, fakeNetNumber, addr); gotNicID != wantNicID {
|
||||
t.Errorf("got CheckLocalAddress(0, %d, %s) = %d, want = %d", fakeNetNumber, addr, gotNicID, wantNicID)
|
||||
}
|
||||
addrBytes[0]++
|
||||
}
|
||||
|
||||
// Trying the next address should always fail since it is outside the range.
|
||||
if gotNicID := s.CheckLocalAddress(0, fakeNetNumber, tcpip.Address(addrBytes)); gotNicID != 0 {
|
||||
t.Errorf("got CheckLocalAddress(0, %d, %s) = %d, want = 0", fakeNetNumber, tcpip.Address(addrBytes), gotNicID)
|
||||
}
|
||||
}
|
||||
|
||||
// Set a range of addresses, then remove it again, and check at each step that
|
||||
// CheckLocalAddress returns the correct NIC for each address or zero if not
|
||||
// existent.
|
||||
func TestCheckLocalAddressForSubnet(t *testing.T) {
|
||||
const nicID tcpip.NICID = 1
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()},
|
||||
})
|
||||
|
||||
ep := channel.New(10, defaultMTU, "")
|
||||
if err := s.CreateNIC(nicID, ep); err != nil {
|
||||
t.Fatal("CreateNIC failed:", err)
|
||||
}
|
||||
|
||||
{
|
||||
subnet, err := tcpip.NewSubnet("\x00", "\x00")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: nicID}})
|
||||
}
|
||||
|
||||
subnet, err := tcpip.NewSubnet(tcpip.Address("\xa0"), tcpip.AddressMask("\xf0"))
|
||||
if err != nil {
|
||||
t.Fatal("NewSubnet failed:", err)
|
||||
}
|
||||
|
||||
testNicForAddressRange(t, nicID, s, subnet, false /* rangeExists */)
|
||||
|
||||
if err := s.AddAddressRange(nicID, fakeNetNumber, subnet); err != nil {
|
||||
t.Fatal("AddAddressRange failed:", err)
|
||||
}
|
||||
|
||||
testNicForAddressRange(t, nicID, s, subnet, true /* rangeExists */)
|
||||
|
||||
if err := s.RemoveAddressRange(nicID, subnet); err != nil {
|
||||
t.Fatal("RemoveAddressRange failed:", err)
|
||||
}
|
||||
|
||||
testNicForAddressRange(t, nicID, s, subnet, false /* rangeExists */)
|
||||
}
|
||||
|
||||
// Set a range of addresses, then send a packet to a destination outside the
|
||||
// range and then check it doesn't get delivered.
|
||||
func TestAddressRangeRejectsNonmatchingPacket(t *testing.T) {
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()},
|
||||
})
|
||||
|
||||
ep := channel.New(10, defaultMTU, "")
|
||||
if err := s.CreateNIC(1, ep); err != nil {
|
||||
t.Fatal("CreateNIC failed:", err)
|
||||
}
|
||||
|
||||
{
|
||||
subnet, err := tcpip.NewSubnet("\x00", "\x00")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: 1}})
|
||||
}
|
||||
|
||||
fakeNet := s.NetworkProtocolInstance(fakeNetNumber).(*fakeNetworkProtocol)
|
||||
|
||||
buf := buffer.NewView(30)
|
||||
|
||||
const localAddrByte byte = 0x01
|
||||
buf[dstAddrOffset] = localAddrByte
|
||||
subnet, err := tcpip.NewSubnet(tcpip.Address("\x10"), tcpip.AddressMask("\xF0"))
|
||||
if err != nil {
|
||||
t.Fatal("NewSubnet failed:", err)
|
||||
}
|
||||
if err := s.AddAddressRange(1, fakeNetNumber, subnet); err != nil {
|
||||
t.Fatal("AddAddressRange failed:", err)
|
||||
}
|
||||
testFailingRecv(t, fakeNet, localAddrByte, ep, buf)
|
||||
}
|
||||
|
||||
func TestNetworkOptions(t *testing.T) {
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()},
|
||||
|
@ -1827,56 +1683,6 @@ func TestNetworkOptions(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func stackContainsAddressRange(s *stack.Stack, id tcpip.NICID, addrRange tcpip.Subnet) bool {
|
||||
ranges, ok := s.NICAddressRanges()[id]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
for _, r := range ranges {
|
||||
if r == addrRange {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func TestAddresRangeAddRemove(t *testing.T) {
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()},
|
||||
})
|
||||
ep := channel.New(10, defaultMTU, "")
|
||||
if err := s.CreateNIC(1, ep); err != nil {
|
||||
t.Fatal("CreateNIC failed:", err)
|
||||
}
|
||||
|
||||
addr := tcpip.Address("\x01\x01\x01\x01")
|
||||
mask := tcpip.AddressMask(strings.Repeat("\xff", len(addr)))
|
||||
addrRange, err := tcpip.NewSubnet(addr, mask)
|
||||
if err != nil {
|
||||
t.Fatal("NewSubnet failed:", err)
|
||||
}
|
||||
|
||||
if got, want := stackContainsAddressRange(s, 1, addrRange), false; got != want {
|
||||
t.Fatalf("got stackContainsAddressRange(...) = %t, want = %t", got, want)
|
||||
}
|
||||
|
||||
if err := s.AddAddressRange(1, fakeNetNumber, addrRange); err != nil {
|
||||
t.Fatal("AddAddressRange failed:", err)
|
||||
}
|
||||
|
||||
if got, want := stackContainsAddressRange(s, 1, addrRange), true; got != want {
|
||||
t.Fatalf("got stackContainsAddressRange(...) = %t, want = %t", got, want)
|
||||
}
|
||||
|
||||
if err := s.RemoveAddressRange(1, addrRange); err != nil {
|
||||
t.Fatal("RemoveAddressRange failed:", err)
|
||||
}
|
||||
|
||||
if got, want := stackContainsAddressRange(s, 1, addrRange), false; got != want {
|
||||
t.Fatalf("got stackContainsAddressRange(...) = %t, want = %t", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMainNICAddressAddPrimaryNonPrimary(t *testing.T) {
|
||||
for _, addrLen := range []int{4, 16} {
|
||||
t.Run(fmt.Sprintf("addrLen=%d", addrLen), func(t *testing.T) {
|
||||
|
|
Loading…
Reference in New Issue