mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Use a single NetworkEndpoint per address
This change was already done as of https://github.com/google/gvisor/commit/1736b2208f but https://github.com/google/gvisor/commit/a174aa7597 conflicted with that change and it was missed in reviews. This change fixes the conflict. PiperOrigin-RevId: 328920372
This commit is contained in:
committed by
gVisor bot
parent
421e35020b
commit
8ae0ab722c
+12
-16
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user