diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-08-28 12:12:19 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-08-28 12:12:19 +0000 |
commit | c60acd713217a38c903c149448b31a7638e7461c (patch) | |
tree | 17670129104bb60bbeb4bd9d575c4da09bd87d4f /pkg/tcpip/stack | |
parent | aed22b4e8aefe49593475db79c1b12d085d839f8 (diff) | |
parent | 8ae0ab722c2e5d1bacb96fbac4baa25b49dadd3a (diff) |
Merge release-20200818.0-79-g8ae0ab722 (automated)
Diffstat (limited to 'pkg/tcpip/stack')
-rw-r--r-- | pkg/tcpip/stack/nic.go | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/pkg/tcpip/stack/nic.go b/pkg/tcpip/stack/nic.go index 0c811efdb..8e700990d 100644 --- a/pkg/tcpip/stack/nic.go +++ b/pkg/tcpip/stack/nic.go @@ -137,6 +137,7 @@ func newNIC(stack *Stack, id tcpip.NICID, name string, ep LinkEndpoint, ctx NICC nic.mu.ndp.initializeTempAddrState() // Check for Neighbor Unreachability Detection support. + var nud NUDHandler if ep.Capabilities()&CapabilityResolutionRequired != 0 && len(stack.linkAddrResolvers) != 0 && stack.useNeighborCache { rng := rand.New(rand.NewSource(stack.clock.NowNanoseconds())) nic.neigh = &neighborCache{ @@ -144,16 +145,24 @@ func newNIC(stack *Stack, id tcpip.NICID, name string, ep LinkEndpoint, ctx NICC state: NewNUDState(stack.nudConfigs, rng), cache: make(map[tcpip.Address]*neighborEntry, neighborCacheSize), } + + // An interface value that holds a nil pointer but non-nil type is not the + // same as the nil interface. Because of this, nud must only be assignd if + // nic.neigh is non-nil since a nil reference to a neighborCache is not + // valid. + // + // See https://golang.org/doc/faq#nil_error for more information. + nud = nic.neigh } - // Register supported packet endpoint protocols. + // Register supported packet and network endpoint protocols. for _, netProto := range header.Ethertypes { nic.mu.packetEPs[netProto] = []PacketEndpoint{} } for _, netProto := range stack.networkProtocols { netNum := netProto.Number() nic.mu.packetEPs[netNum] = nil - nic.networkEndpoints[netNum] = netProto.NewEndpoint(id, stack, nic.neigh, nic, ep, stack) + nic.networkEndpoints[netNum] = netProto.NewEndpoint(id, stack, nud, nic, ep, stack) } nic.linkEP.Attach(nic) @@ -819,24 +828,11 @@ func (n *NIC) addAddressLocked(protocolAddress tcpip.ProtocolAddress, peb Primar } } - netProto, ok := n.stack.networkProtocols[protocolAddress.Protocol] + ep, ok := n.networkEndpoints[protocolAddress.Protocol] if !ok { return nil, tcpip.ErrUnknownProtocol } - var nud NUDHandler - if n.neigh != nil { - // An interface value that holds a nil concrete value is itself non-nil. - // For this reason, n.neigh cannot be passed directly to NewEndpoint so - // NetworkEndpoints don't confuse it for non-nil. - // - // See https://golang.org/doc/faq#nil_error for more information. - nud = n.neigh - } - - // Create the new network endpoint. - ep := netProto.NewEndpoint(n.id, n.stack, nud, n, n.linkEP, n.stack) - isIPv6Unicast := protocolAddress.Protocol == header.IPv6ProtocolNumber && header.IsV6UnicastAddress(protocolAddress.AddressWithPrefix.Address) // If the address is an IPv6 address and it is a permanent address, |