mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Refactor GetMainNICAddress
It previously returned an error but it could only be UnknownNICID. It now returns a boolean to indicate whether the nic exists or not. PiperOrigin-RevId: 353337489
This commit is contained in:
@@ -262,10 +262,10 @@ func (p *protocol) LinkAddressRequest(targetAddr, localAddr tcpip.Address, remot
|
||||
|
||||
nicID := nic.ID()
|
||||
if len(localAddr) == 0 {
|
||||
addr, err := p.stack.GetMainNICAddress(nicID, header.IPv4ProtocolNumber)
|
||||
if err != nil {
|
||||
addr, ok := p.stack.GetMainNICAddress(nicID, header.IPv4ProtocolNumber)
|
||||
if !ok {
|
||||
stats.OutgoingRequestInterfaceHasNoLocalAddressErrors.Increment()
|
||||
return err
|
||||
return tcpip.ErrUnknownNICID
|
||||
}
|
||||
|
||||
if len(addr.Address) == 0 {
|
||||
|
||||
@@ -1443,9 +1443,9 @@ func (e *endpoint) processIPOptions(pkt *stack.PacketBuffer, orig header.IPv4Opt
|
||||
// This will need tweaking when we start really forwarding packets
|
||||
// as we may need to get two addresses, for rx and tx interfaces.
|
||||
// We will also have to take usage into account.
|
||||
prefixedAddress, err := e.protocol.stack.GetMainNICAddress(e.nic.ID(), ProtocolNumber)
|
||||
prefixedAddress, ok := e.protocol.stack.GetMainNICAddress(e.nic.ID(), ProtocolNumber)
|
||||
localAddress := prefixedAddress.Address
|
||||
if err != nil {
|
||||
if !ok {
|
||||
h := header.IPv4(pkt.NetworkHeader().View())
|
||||
dstAddr := h.DestinationAddress()
|
||||
if pkt.NetworkPacketInfo.LocalAddressBroadcast || header.IsV4MulticastAddress(dstAddr) {
|
||||
|
||||
@@ -371,12 +371,10 @@ func TestAddIpv6Address(t *testing.T) {
|
||||
t.Fatalf("AddAddress(_, %d, nil) = %s", ProtocolNumber, err)
|
||||
}
|
||||
|
||||
addr, err := s.GetMainNICAddress(1, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("stack.GetMainNICAddress(_, _) err = %s", err)
|
||||
}
|
||||
if addr.Address != test.addr {
|
||||
t.Fatalf("got stack.GetMainNICAddress(_, _) = %s, want = %s", addr.Address, test.addr)
|
||||
if addr, ok := s.GetMainNICAddress(1, header.IPv6ProtocolNumber); !ok {
|
||||
t.Fatalf("got stack.GetMainNICAddress(1, %d) = (_, false), want = (_, true)", header.IPv6ProtocolNumber)
|
||||
} else if addr.Address != test.addr {
|
||||
t.Fatalf("got stack.GetMainNICAddress(1_, %d) = (%s, true), want = (%s, true)", header.IPv6ProtocolNumber, addr.Address, test.addr)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
+57
-98
@@ -45,6 +45,8 @@ const (
|
||||
linkAddr3 = tcpip.LinkAddress("\x02\x02\x03\x04\x05\x08")
|
||||
linkAddr4 = tcpip.LinkAddress("\x02\x02\x03\x04\x05\x09")
|
||||
|
||||
defaultPrefixLen = 128
|
||||
|
||||
// Extra time to use when waiting for an async event to occur.
|
||||
defaultAsyncPositiveEventTimeout = 10 * time.Second
|
||||
|
||||
@@ -330,8 +332,12 @@ func TestDADDisabled(t *testing.T) {
|
||||
t.Fatalf("CreateNIC(%d, _) = %s", nicID, err)
|
||||
}
|
||||
|
||||
if err := s.AddAddress(nicID, header.IPv6ProtocolNumber, addr1); err != nil {
|
||||
t.Fatalf("AddAddress(%d, %d, %s) = %s", nicID, header.IPv6ProtocolNumber, addr1, err)
|
||||
addrWithPrefix := tcpip.AddressWithPrefix{
|
||||
Address: addr1,
|
||||
PrefixLen: defaultPrefixLen,
|
||||
}
|
||||
if err := s.AddAddressWithPrefix(nicID, header.IPv6ProtocolNumber, addrWithPrefix); err != nil {
|
||||
t.Fatalf("AddAddressWithPrefix(%d, %d, %s) = %s", nicID, header.IPv6ProtocolNumber, addrWithPrefix, err)
|
||||
}
|
||||
|
||||
// Should get the address immediately since we should not have performed
|
||||
@@ -344,12 +350,8 @@ func TestDADDisabled(t *testing.T) {
|
||||
default:
|
||||
t.Fatal("expected DAD event")
|
||||
}
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("stack.GetMainNICAddress(%d, %d) err = %s", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if addr.Address != addr1 {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, addr, addr1)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addrWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// We should not have sent any NDP NS messages.
|
||||
@@ -440,24 +442,24 @@ func TestDADResolve(t *testing.T) {
|
||||
NIC: nicID,
|
||||
}})
|
||||
|
||||
if err := s.AddAddress(nicID, header.IPv6ProtocolNumber, addr1); err != nil {
|
||||
t.Fatalf("AddAddress(%d, %d, %s) = %s", nicID, header.IPv6ProtocolNumber, addr1, err)
|
||||
addrWithPrefix := tcpip.AddressWithPrefix{
|
||||
Address: addr1,
|
||||
PrefixLen: defaultPrefixLen,
|
||||
}
|
||||
if err := s.AddAddressWithPrefix(nicID, header.IPv6ProtocolNumber, addrWithPrefix); err != nil {
|
||||
t.Fatalf("AddAddressWithPrefix(%d, %d, %s) = %s", nicID, header.IPv6ProtocolNumber, addrWithPrefix, err)
|
||||
}
|
||||
|
||||
// Address should not be considered bound to the NIC yet (DAD ongoing).
|
||||
if addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %s), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Make sure the address does not resolve before the resolution time has
|
||||
// passed.
|
||||
time.Sleep(test.expectedRetransmitTimer*time.Duration(test.dupAddrDetectTransmits) - defaultAsyncNegativeEventTimeout)
|
||||
if addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, %d) = (_, %s), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
// Should not get a route even if we specify the local address as the
|
||||
// tentative address.
|
||||
@@ -493,10 +495,8 @@ func TestDADResolve(t *testing.T) {
|
||||
t.Errorf("dad event mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
if addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, %d) = (_, %s), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if addr.Address != addr1 {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, addr, addr1)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addrWithPrefix); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
// Should get a route using the address now that it is resolved.
|
||||
{
|
||||
@@ -662,12 +662,8 @@ func TestDADFail(t *testing.T) {
|
||||
|
||||
// Address should not be considered bound to the NIC yet
|
||||
// (DAD ongoing).
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Receive a packet to simulate an address conflict.
|
||||
@@ -691,12 +687,8 @@ func TestDADFail(t *testing.T) {
|
||||
t.Errorf("dad event mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
addr, err = s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Attempting to add the address again should not fail if the address's
|
||||
@@ -777,12 +769,8 @@ func TestDADStop(t *testing.T) {
|
||||
}
|
||||
|
||||
// Address should not be considered bound to the NIC yet (DAD ongoing).
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
test.stopFn(t, s)
|
||||
@@ -800,12 +788,8 @@ func TestDADStop(t *testing.T) {
|
||||
}
|
||||
|
||||
if !test.skipFinalAddrCheck {
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -901,26 +885,25 @@ func TestSetNDPConfigurations(t *testing.T) {
|
||||
}
|
||||
|
||||
// Add addresses for each NIC.
|
||||
if err := s.AddAddress(nicID1, header.IPv6ProtocolNumber, addr1); err != nil {
|
||||
t.Fatalf("AddAddress(%d, %d, %s) = %s", nicID1, header.IPv6ProtocolNumber, addr1, err)
|
||||
addrWithPrefix1 := tcpip.AddressWithPrefix{Address: addr1, PrefixLen: defaultPrefixLen}
|
||||
if err := s.AddAddressWithPrefix(nicID1, header.IPv6ProtocolNumber, addrWithPrefix1); err != nil {
|
||||
t.Fatalf("AddAddressWithPrefix(%d, %d, %s) = %s", nicID1, header.IPv6ProtocolNumber, addrWithPrefix1, err)
|
||||
}
|
||||
if err := s.AddAddress(nicID2, header.IPv6ProtocolNumber, addr2); err != nil {
|
||||
t.Fatalf("AddAddress(%d, %d, %s) = %s", nicID2, header.IPv6ProtocolNumber, addr2, err)
|
||||
addrWithPrefix2 := tcpip.AddressWithPrefix{Address: addr2, PrefixLen: defaultPrefixLen}
|
||||
if err := s.AddAddressWithPrefix(nicID2, header.IPv6ProtocolNumber, addrWithPrefix2); err != nil {
|
||||
t.Fatalf("AddAddressWithPrefix(%d, %d, %s) = %s", nicID2, header.IPv6ProtocolNumber, addrWithPrefix2, err)
|
||||
}
|
||||
expectDADEvent(nicID2, addr2)
|
||||
if err := s.AddAddress(nicID3, header.IPv6ProtocolNumber, addr3); err != nil {
|
||||
t.Fatalf("AddAddress(%d, %d, %s) = %s", nicID3, header.IPv6ProtocolNumber, addr3, err)
|
||||
addrWithPrefix3 := tcpip.AddressWithPrefix{Address: addr3, PrefixLen: defaultPrefixLen}
|
||||
if err := s.AddAddressWithPrefix(nicID3, header.IPv6ProtocolNumber, addrWithPrefix3); err != nil {
|
||||
t.Fatalf("AddAddressWithPrefix(%d, %d, %s) = %s", nicID3, header.IPv6ProtocolNumber, addrWithPrefix3, err)
|
||||
}
|
||||
expectDADEvent(nicID3, addr3)
|
||||
|
||||
// Address should not be considered bound to NIC(1) yet
|
||||
// (DAD ongoing).
|
||||
addr, err := s.GetMainNICAddress(nicID1, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID1, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID1, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID1, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Should get the address on NIC(2) and NIC(3)
|
||||
@@ -928,31 +911,19 @@ func TestSetNDPConfigurations(t *testing.T) {
|
||||
// it as the stack was configured to not do DAD by
|
||||
// default and we only updated the NDP configurations on
|
||||
// NIC(1).
|
||||
addr, err = s.GetMainNICAddress(nicID2, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID2, header.IPv6ProtocolNumber, err)
|
||||
if err := checkGetMainNICAddress(s, nicID2, header.IPv6ProtocolNumber, addrWithPrefix2); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if addr.Address != addr2 {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID2, header.IPv6ProtocolNumber, addr, addr2)
|
||||
}
|
||||
addr, err = s.GetMainNICAddress(nicID3, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID3, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if addr.Address != addr3 {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID3, header.IPv6ProtocolNumber, addr, addr3)
|
||||
if err := checkGetMainNICAddress(s, nicID3, header.IPv6ProtocolNumber, addrWithPrefix3); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Sleep until right (500ms before) before resolution to
|
||||
// make sure the address didn't resolve on NIC(1) yet.
|
||||
const delta = 500 * time.Millisecond
|
||||
time.Sleep(time.Duration(test.dupAddrDetectTransmits)*test.expectedRetransmitTimer - delta)
|
||||
addr, err = s.GetMainNICAddress(nicID1, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID1, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID1, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID1, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Wait for DAD to resolve.
|
||||
@@ -970,12 +941,8 @@ func TestSetNDPConfigurations(t *testing.T) {
|
||||
t.Errorf("dad event mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
addr, err = s.GetMainNICAddress(nicID1, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID1, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if addr.Address != addr1 {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID1, header.IPv6ProtocolNumber, addr, addr1)
|
||||
if err := checkGetMainNICAddress(s, nicID1, header.IPv6ProtocolNumber, addrWithPrefix1); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -2946,10 +2913,8 @@ func TestAutoGenAddrDeprecateFromPI(t *testing.T) {
|
||||
expectPrimaryAddr := func(addr tcpip.AddressWithPrefix) {
|
||||
t.Helper()
|
||||
|
||||
if got, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Fatalf("s.GetMainNICAddress(%d, %d): %s", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if got != addr {
|
||||
t.Errorf("got s.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, got, addr)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addr); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if got := addrForNewConnection(t, s); got != addr.Address {
|
||||
@@ -3094,10 +3059,8 @@ func TestAutoGenAddrJobDeprecation(t *testing.T) {
|
||||
expectPrimaryAddr := func(addr tcpip.AddressWithPrefix) {
|
||||
t.Helper()
|
||||
|
||||
if got, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Fatalf("s.GetMainNICAddress(%d, %d): %s", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if got != addr {
|
||||
t.Errorf("got s.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, got, addr)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addr); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if got := addrForNewConnection(t, s); got != addr.Address {
|
||||
@@ -3244,10 +3207,8 @@ func TestAutoGenAddrJobDeprecation(t *testing.T) {
|
||||
t.Fatalf("should not have %s in the list of addresses", addr2)
|
||||
}
|
||||
// Should not have any primary endpoints.
|
||||
if got, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Fatalf("s.GetMainNICAddress(%d, %d): %s", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if want := (tcpip.AddressWithPrefix{}); got != want {
|
||||
t.Errorf("got s.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, got, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
wq := waiter.Queue{}
|
||||
we, ch := waiter.NewChannelEntry(nil)
|
||||
@@ -3621,10 +3582,8 @@ func TestAutoGenAddrAfterRemoval(t *testing.T) {
|
||||
expectPrimaryAddr := func(addr tcpip.AddressWithPrefix) {
|
||||
t.Helper()
|
||||
|
||||
if got, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber); err != nil {
|
||||
t.Fatalf("s.GetMainNICAddress(%d, %d): %s", nicID, header.IPv6ProtocolNumber, err)
|
||||
} else if got != addr {
|
||||
t.Errorf("got s.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, got, addr)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addr); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if got := addrForNewConnection(t, s); got != addr.Address {
|
||||
|
||||
@@ -1196,19 +1196,19 @@ func (s *Stack) AllAddresses() map[tcpip.NICID][]tcpip.ProtocolAddress {
|
||||
|
||||
// GetMainNICAddress returns the first non-deprecated primary address and prefix
|
||||
// for the given NIC and protocol. If no non-deprecated primary address exists,
|
||||
// a deprecated primary address and prefix will be returned. Returns an error if
|
||||
// a deprecated primary address and prefix will be returned. Returns false if
|
||||
// the NIC doesn't exist and an empty value if the NIC doesn't have a primary
|
||||
// address for the given protocol.
|
||||
func (s *Stack) GetMainNICAddress(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber) (tcpip.AddressWithPrefix, *tcpip.Error) {
|
||||
func (s *Stack) GetMainNICAddress(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber) (tcpip.AddressWithPrefix, bool) {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
nic, ok := s.nics[id]
|
||||
if !ok {
|
||||
return tcpip.AddressWithPrefix{}, tcpip.ErrUnknownNICID
|
||||
return tcpip.AddressWithPrefix{}, false
|
||||
}
|
||||
|
||||
return nic.primaryAddress(protocol), nil
|
||||
return nic.primaryAddress(protocol), true
|
||||
}
|
||||
|
||||
func (s *Stack) getAddressEP(nic *NIC, localAddr, remoteAddr tcpip.Address, netProto tcpip.NetworkProtocolNumber) AssignableAddressEndpoint {
|
||||
|
||||
@@ -60,6 +60,15 @@ const (
|
||||
protocolNumberOffset = 2
|
||||
)
|
||||
|
||||
func checkGetMainNICAddress(s *stack.Stack, nicID tcpip.NICID, proto tcpip.NetworkProtocolNumber, want tcpip.AddressWithPrefix) error {
|
||||
if addr, ok := s.GetMainNICAddress(nicID, proto); !ok {
|
||||
return fmt.Errorf("got stack.GetMainNICAddress(%d, %d) = (_, false), want = (_, true)", nicID, proto)
|
||||
} else if addr != want {
|
||||
return fmt.Errorf("got stack.GetMainNICAddress(%d, %d) = (%s, true), want = (%s, true)", nicID, proto, addr, want)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// fakeNetworkEndpoint is a network-layer protocol endpoint. It counts sent and
|
||||
// received packets; the counts of all endpoints are aggregated in the protocol
|
||||
// descriptor.
|
||||
@@ -1873,20 +1882,20 @@ func TestGetMainNICAddressAddPrimaryNonPrimary(t *testing.T) {
|
||||
// Check that GetMainNICAddress returns an address if at least
|
||||
// one primary address was added. In that case make sure the
|
||||
// address/prefixLen matches what we added.
|
||||
gotAddr, err := s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if err != nil {
|
||||
t.Fatal("GetMainNICAddress failed:", err)
|
||||
gotAddr, ok := s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if !ok {
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (_, false), want = (_, true)", fakeNetNumber)
|
||||
}
|
||||
if len(primaryAddrAdded) == 0 {
|
||||
// No primary addresses present.
|
||||
if wantAddr := (tcpip.AddressWithPrefix{}); gotAddr != wantAddr {
|
||||
t.Fatalf("GetMainNICAddress: got addr = %s, want = %s", gotAddr, wantAddr)
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (%s, true)", fakeNetNumber, gotAddr, wantAddr)
|
||||
}
|
||||
} else {
|
||||
// At least one primary address was added, verify the returned
|
||||
// address is in the list of primary addresses we added.
|
||||
if _, ok := primaryAddrAdded[gotAddr]; !ok {
|
||||
t.Fatalf("GetMainNICAddress: got = %s, want any in {%v}", gotAddr, primaryAddrAdded)
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (%s, true)", fakeNetNumber, gotAddr, primaryAddrAdded)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1927,12 +1936,8 @@ func TestGetMainNICAddressAddRemove(t *testing.T) {
|
||||
}
|
||||
|
||||
// Check that we get the right initial address and prefix length.
|
||||
gotAddr, err := s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if err != nil {
|
||||
t.Fatal("GetMainNICAddress failed:", err)
|
||||
}
|
||||
if wantAddr := protocolAddress.AddressWithPrefix; gotAddr != wantAddr {
|
||||
t.Fatalf("got s.GetMainNICAddress(...) = %s, want = %s", gotAddr, wantAddr)
|
||||
if err := checkGetMainNICAddress(s, 1, fakeNetNumber, protocolAddress.AddressWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := s.RemoveAddress(1, protocolAddress.AddressWithPrefix.Address); err != nil {
|
||||
@@ -1940,12 +1945,8 @@ func TestGetMainNICAddressAddRemove(t *testing.T) {
|
||||
}
|
||||
|
||||
// Check that we get no address after removal.
|
||||
gotAddr, err = s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if err != nil {
|
||||
t.Fatal("GetMainNICAddress failed:", err)
|
||||
}
|
||||
if wantAddr := (tcpip.AddressWithPrefix{}); gotAddr != wantAddr {
|
||||
t.Fatalf("got GetMainNICAddress(...) = %s, want = %s", gotAddr, wantAddr)
|
||||
if err := checkGetMainNICAddress(s, 1, fakeNetNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -2486,12 +2487,12 @@ func TestNICAutoGenLinkLocalAddr(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
gotMainAddr, err := s.GetMainNICAddress(1, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("stack.GetMainNICAddress(_, _) err = %s", err)
|
||||
// Check that we get no address after removal.
|
||||
if err := checkGetMainNICAddress(s, 1, fakeNetNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if gotMainAddr != expectedMainAddr {
|
||||
t.Fatalf("got stack.GetMainNICAddress(_, _) = %s, want = %s", gotMainAddr, expectedMainAddr)
|
||||
if err := checkGetMainNICAddress(s, 1, header.IPv6ProtocolNumber, expectedMainAddr); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -2537,12 +2538,8 @@ func TestNoLinkLocalAutoGenForLoopbackNIC(t *testing.T) {
|
||||
t.Fatalf("CreateNICWithOptions(%d, _, %+v) = %s", nicID, nicOpts, err)
|
||||
}
|
||||
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("stack.GetMainNICAddress(%d, _) err = %s", nicID, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Errorf("got stack.GetMainNICAddress(%d, _) = %s, want = %s", nicID, addr, want)
|
||||
if err := checkGetMainNICAddress(s, 1, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -2573,12 +2570,8 @@ func TestNICAutoGenAddrDoesDAD(t *testing.T) {
|
||||
|
||||
// Address should not be considered bound to the
|
||||
// NIC yet (DAD ongoing).
|
||||
addr, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
linkLocalAddr := header.LinkLocalAddr(linkAddr1)
|
||||
@@ -2596,12 +2589,8 @@ func TestNICAutoGenAddrDoesDAD(t *testing.T) {
|
||||
t.Errorf("dad event mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
addr, err = s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{Address: linkLocalAddr, PrefixLen: header.IPv6LinkLocalPrefix.PrefixLen}); addr != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, addr, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{Address: linkLocalAddr, PrefixLen: header.IPv6LinkLocalPrefix.PrefixLen}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2633,17 +2622,17 @@ func TestNewPEBOnPromotionToPermanent(t *testing.T) {
|
||||
if err := s.AddAddressWithOptions(1, fakeNetNumber, "\x01", pi); err != nil {
|
||||
t.Fatal("AddAddressWithOptions failed:", err)
|
||||
}
|
||||
addr, err := s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if err != nil {
|
||||
t.Fatal("s.GetMainNICAddress failed:", err)
|
||||
addr, ok := s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if !ok {
|
||||
t.Fatalf("GetMainNICAddress(1, %d) = (_, false), want = (_, true)", fakeNetNumber)
|
||||
}
|
||||
if pi == stack.NeverPrimaryEndpoint {
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got GetMainNICAddress = %s, want = %s", addr, want)
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (%s, true)", fakeNetNumber, addr, want)
|
||||
|
||||
}
|
||||
} else if addr.Address != "\x01" {
|
||||
t.Fatalf("got GetMainNICAddress = %s, want = 1", addr.Address)
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (1, true)", fakeNetNumber, addr.Address)
|
||||
}
|
||||
|
||||
{
|
||||
@@ -2722,18 +2711,17 @@ func TestNewPEBOnPromotionToPermanent(t *testing.T) {
|
||||
if err := s.RemoveAddress(1, "\x03"); err != nil {
|
||||
t.Fatalf("RemoveAddress failed: %v", err)
|
||||
}
|
||||
addr, err = s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("s.GetMainNICAddress failed: %v", err)
|
||||
addr, ok = s.GetMainNICAddress(1, fakeNetNumber)
|
||||
if !ok {
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (_, false), want = (_, true)", fakeNetNumber)
|
||||
}
|
||||
if ps == stack.NeverPrimaryEndpoint {
|
||||
if want := (tcpip.AddressWithPrefix{}); addr != want {
|
||||
t.Fatalf("got GetMainNICAddress = %s, want = %s", addr, want)
|
||||
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (%s, true)", fakeNetNumber, addr, want)
|
||||
}
|
||||
} else {
|
||||
if addr.Address != "\x01" {
|
||||
t.Fatalf("got GetMainNICAddress = %s, want = 1", addr.Address)
|
||||
t.Fatalf("got GetMainNICAddress(1, %d) = (%s, true), want = (1, true)", fakeNetNumber, addr.Address)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -3259,12 +3247,8 @@ func TestDoDADWhenNICEnabled(t *testing.T) {
|
||||
}
|
||||
|
||||
// Address should be tentative so it should not be a main address.
|
||||
got, err := s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); got != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, got, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Enabling the NIC should start DAD for the address.
|
||||
@@ -3276,12 +3260,8 @@ func TestDoDADWhenNICEnabled(t *testing.T) {
|
||||
}
|
||||
|
||||
// Address should not be considered bound to the NIC yet (DAD ongoing).
|
||||
got, err = s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if want := (tcpip.AddressWithPrefix{}); got != want {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, got, want)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, tcpip.AddressWithPrefix{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Wait for DAD to resolve.
|
||||
@@ -3296,12 +3276,8 @@ func TestDoDADWhenNICEnabled(t *testing.T) {
|
||||
if addrs := s.AllAddresses()[nicID]; !containsV6Addr(addrs, addr.AddressWithPrefix) {
|
||||
t.Fatalf("got s.AllAddresses()[%d] = %+v, want = %+v", nicID, addrs, addr)
|
||||
}
|
||||
got, err = s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if got != addr.AddressWithPrefix {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = %s, want = %s", nicID, header.IPv6ProtocolNumber, got, addr.AddressWithPrefix)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addr.AddressWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Enabling the NIC again should be a no-op.
|
||||
@@ -3311,12 +3287,8 @@ func TestDoDADWhenNICEnabled(t *testing.T) {
|
||||
if addrs := s.AllAddresses()[nicID]; !containsV6Addr(addrs, addr.AddressWithPrefix) {
|
||||
t.Fatalf("got s.AllAddresses()[%d] = %+v, want = %+v", nicID, addrs, addr)
|
||||
}
|
||||
got, err = s.GetMainNICAddress(nicID, header.IPv6ProtocolNumber)
|
||||
if err != nil {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (_, %v), want = (_, nil)", nicID, header.IPv6ProtocolNumber, err)
|
||||
}
|
||||
if got != addr.AddressWithPrefix {
|
||||
t.Fatalf("got stack.GetMainNICAddress(%d, %d) = (%s, nil), want = (%s, nil)", nicID, header.IPv6ProtocolNumber, got, addr.AddressWithPrefix)
|
||||
if err := checkGetMainNICAddress(s, nicID, header.IPv6ProtocolNumber, addr.AddressWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3790,20 +3762,16 @@ func TestGetMainNICAddressWhenNICDisabled(t *testing.T) {
|
||||
}
|
||||
|
||||
// Check that we get the right initial address and prefix length.
|
||||
if gotAddr, err := s.GetMainNICAddress(nicID, fakeNetNumber); err != nil {
|
||||
t.Fatalf("GetMainNICAddress(%d, %d): %s", nicID, fakeNetNumber, err)
|
||||
} else if gotAddr != protocolAddress.AddressWithPrefix {
|
||||
t.Fatalf("got GetMainNICAddress(%d, %d) = %s, want = %s", nicID, fakeNetNumber, gotAddr, protocolAddress.AddressWithPrefix)
|
||||
if err := checkGetMainNICAddress(s, nicID, fakeNetNumber, protocolAddress.AddressWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Should still get the address when the NIC is diabled.
|
||||
if err := s.DisableNIC(nicID); err != nil {
|
||||
t.Fatalf("DisableNIC(%d): %s", nicID, err)
|
||||
}
|
||||
if gotAddr, err := s.GetMainNICAddress(nicID, fakeNetNumber); err != nil {
|
||||
t.Fatalf("GetMainNICAddress(%d, %d): %s", nicID, fakeNetNumber, err)
|
||||
} else if gotAddr != protocolAddress.AddressWithPrefix {
|
||||
t.Fatalf("got GetMainNICAddress(%d, %d) = %s, want = %s", nicID, fakeNetNumber, gotAddr, protocolAddress.AddressWithPrefix)
|
||||
if err := checkGetMainNICAddress(s, nicID, fakeNetNumber, protocolAddress.AddressWithPrefix); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user