mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Deduplicate code in ipv6.protocol
PiperOrigin-RevId: 344009602
This commit is contained in:
committed by
gVisor bot
parent
ba2d5cb7e1
commit
1de08889df
@@ -273,7 +273,7 @@ func (e *endpoint) Enable() *tcpip.Error {
|
||||
}
|
||||
|
||||
// Do not auto-generate an IPv6 link-local address for loopback devices.
|
||||
if e.protocol.autoGenIPv6LinkLocal && !e.nic.IsLoopback() {
|
||||
if e.protocol.options.AutoGenLinkLocal && !e.nic.IsLoopback() {
|
||||
// The valid and preferred lifetime is infinite for the auto-generated
|
||||
// link-local address.
|
||||
e.mu.ndp.doSLAAC(header.IPv6LinkLocalPrefix.Subnet(), header.NDPInfiniteLifetime, header.NDPInfiniteLifetime)
|
||||
@@ -1407,7 +1407,8 @@ var _ stack.NetworkProtocol = (*protocol)(nil)
|
||||
var _ fragmentation.TimeoutHandler = (*protocol)(nil)
|
||||
|
||||
type protocol struct {
|
||||
stack *stack.Stack
|
||||
stack *stack.Stack
|
||||
options Options
|
||||
|
||||
mu struct {
|
||||
sync.RWMutex
|
||||
@@ -1431,26 +1432,6 @@ type protocol struct {
|
||||
forwarding uint32
|
||||
|
||||
fragmentation *fragmentation.Fragmentation
|
||||
|
||||
// ndpDisp is the NDP event dispatcher that is used to send the netstack
|
||||
// integrator NDP related events.
|
||||
ndpDisp NDPDispatcher
|
||||
|
||||
// ndpConfigs is the default NDP configurations used by an IPv6 endpoint.
|
||||
ndpConfigs NDPConfigurations
|
||||
|
||||
// opaqueIIDOpts hold the options for generating opaque interface identifiers
|
||||
// (IIDs) as outlined by RFC 7217.
|
||||
opaqueIIDOpts OpaqueInterfaceIdentifierOptions
|
||||
|
||||
// tempIIDSeed is used to seed the initial temporary interface identifier
|
||||
// history value used to generate IIDs for temporary SLAAC addresses.
|
||||
tempIIDSeed []byte
|
||||
|
||||
// autoGenIPv6LinkLocal determines whether or not the stack attempts to
|
||||
// auto-generate an IPv6 link-local address for newly enabled non-loopback
|
||||
// NICs. See the AutoGenIPv6LinkLocal field of Options for more details.
|
||||
autoGenIPv6LinkLocal bool
|
||||
}
|
||||
|
||||
// Number returns the ipv6 protocol number.
|
||||
@@ -1486,7 +1467,7 @@ func (p *protocol) NewEndpoint(nic stack.NetworkInterface, linkAddrCache stack.L
|
||||
e.mu.addressableEndpointState.Init(e)
|
||||
e.mu.ndp = ndpState{
|
||||
ep: e,
|
||||
configs: p.ndpConfigs,
|
||||
configs: p.options.NDPConfigs,
|
||||
dad: make(map[tcpip.Address]dadState),
|
||||
defaultRouters: make(map[tcpip.Address]defaultRouterState),
|
||||
onLinkPrefixes: make(map[tcpip.Subnet]onLinkPrefixState),
|
||||
@@ -1615,17 +1596,17 @@ type Options struct {
|
||||
// NDPConfigs is the default NDP configurations used by interfaces.
|
||||
NDPConfigs NDPConfigurations
|
||||
|
||||
// AutoGenIPv6LinkLocal determines whether or not the stack attempts to
|
||||
// auto-generate an IPv6 link-local address for newly enabled non-loopback
|
||||
// AutoGenLinkLocal determines whether or not the stack attempts to
|
||||
// auto-generate a link-local address for newly enabled non-loopback
|
||||
// NICs.
|
||||
//
|
||||
// Note, setting this to true does not mean that a link-local address is
|
||||
// assigned right away, or at all. If Duplicate Address Detection is enabled,
|
||||
// an address is only assigned if it successfully resolves. If it fails, no
|
||||
// further attempts are made to auto-generate an IPv6 link-local adddress.
|
||||
// further attempts are made to auto-generate a link-local adddress.
|
||||
//
|
||||
// The generated link-local address follows RFC 4291 Appendix A guidelines.
|
||||
AutoGenIPv6LinkLocal bool
|
||||
AutoGenLinkLocal bool
|
||||
|
||||
// NDPDisp is the NDP event dispatcher that an integrator can provide to
|
||||
// receive NDP related events.
|
||||
@@ -1660,15 +1641,11 @@ func NewProtocolWithOptions(opts Options) stack.NetworkProtocolFactory {
|
||||
|
||||
return func(s *stack.Stack) stack.NetworkProtocol {
|
||||
p := &protocol{
|
||||
stack: s,
|
||||
stack: s,
|
||||
options: opts,
|
||||
|
||||
ids: ids,
|
||||
hashIV: hashIV,
|
||||
|
||||
ndpDisp: opts.NDPDisp,
|
||||
ndpConfigs: opts.NDPConfigs,
|
||||
opaqueIIDOpts: opts.OpaqueIIDOpts,
|
||||
tempIIDSeed: opts.TempIIDSeed,
|
||||
autoGenIPv6LinkLocal: opts.AutoGenIPv6LinkLocal,
|
||||
}
|
||||
p.fragmentation = fragmentation.NewFragmentation(header.IPv6FragmentExtHdrFragmentOffsetBytesPerUnit, fragmentation.HighFragThreshold, fragmentation.LowFragThreshold, ReassembleTimeout, s.Clock(), p)
|
||||
p.mu.eps = make(map[*endpoint]struct{})
|
||||
|
||||
@@ -648,7 +648,7 @@ func (ndp *ndpState) startDuplicateAddressDetection(addr tcpip.Address, addressE
|
||||
|
||||
// Consider DAD to have resolved even if no DAD messages were actually
|
||||
// transmitted.
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnDuplicateAddressDetectionStatus(ndp.ep.nic.ID(), addr, true, nil)
|
||||
}
|
||||
|
||||
@@ -720,7 +720,7 @@ func (ndp *ndpState) startDuplicateAddressDetection(addr tcpip.Address, addressE
|
||||
// integrator know DAD has completed.
|
||||
delete(ndp.dad, addr)
|
||||
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnDuplicateAddressDetectionStatus(ndp.ep.nic.ID(), addr, dadDone, err)
|
||||
}
|
||||
|
||||
@@ -823,7 +823,7 @@ func (ndp *ndpState) stopDuplicateAddressDetection(addr tcpip.Address) {
|
||||
delete(ndp.dad, addr)
|
||||
|
||||
// Let the integrator know DAD did not resolve.
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnDuplicateAddressDetectionStatus(ndp.ep.nic.ID(), addr, false, nil)
|
||||
}
|
||||
}
|
||||
@@ -846,7 +846,7 @@ func (ndp *ndpState) handleRA(ip tcpip.Address, ra header.NDPRouterAdvert) {
|
||||
// Only worry about the DHCPv6 configuration if we have an NDPDispatcher as we
|
||||
// only inform the dispatcher on configuration changes. We do nothing else
|
||||
// with the information.
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
var configuration DHCPv6ConfigurationFromNDPRA
|
||||
switch {
|
||||
case ra.ManagedAddrConfFlag():
|
||||
@@ -903,20 +903,20 @@ func (ndp *ndpState) handleRA(ip tcpip.Address, ra header.NDPRouterAdvert) {
|
||||
for opt, done, _ := it.Next(); !done; opt, done, _ = it.Next() {
|
||||
switch opt := opt.(type) {
|
||||
case header.NDPRecursiveDNSServer:
|
||||
if ndp.ep.protocol.ndpDisp == nil {
|
||||
if ndp.ep.protocol.options.NDPDisp == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
addrs, _ := opt.Addresses()
|
||||
ndp.ep.protocol.ndpDisp.OnRecursiveDNSServerOption(ndp.ep.nic.ID(), addrs, opt.Lifetime())
|
||||
ndp.ep.protocol.options.NDPDisp.OnRecursiveDNSServerOption(ndp.ep.nic.ID(), addrs, opt.Lifetime())
|
||||
|
||||
case header.NDPDNSSearchList:
|
||||
if ndp.ep.protocol.ndpDisp == nil {
|
||||
if ndp.ep.protocol.options.NDPDisp == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
domainNames, _ := opt.DomainNames()
|
||||
ndp.ep.protocol.ndpDisp.OnDNSSearchListOption(ndp.ep.nic.ID(), domainNames, opt.Lifetime())
|
||||
ndp.ep.protocol.options.NDPDisp.OnDNSSearchListOption(ndp.ep.nic.ID(), domainNames, opt.Lifetime())
|
||||
|
||||
case header.NDPPrefixInformation:
|
||||
prefix := opt.Subnet()
|
||||
@@ -964,7 +964,7 @@ func (ndp *ndpState) invalidateDefaultRouter(ip tcpip.Address) {
|
||||
delete(ndp.defaultRouters, ip)
|
||||
|
||||
// Let the integrator know a discovered default router is invalidated.
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnDefaultRouterInvalidated(ndp.ep.nic.ID(), ip)
|
||||
}
|
||||
}
|
||||
@@ -976,7 +976,7 @@ func (ndp *ndpState) invalidateDefaultRouter(ip tcpip.Address) {
|
||||
//
|
||||
// The IPv6 endpoint that ndp belongs to MUST be locked.
|
||||
func (ndp *ndpState) rememberDefaultRouter(ip tcpip.Address, rl time.Duration) {
|
||||
ndpDisp := ndp.ep.protocol.ndpDisp
|
||||
ndpDisp := ndp.ep.protocol.options.NDPDisp
|
||||
if ndpDisp == nil {
|
||||
return
|
||||
}
|
||||
@@ -1006,7 +1006,7 @@ func (ndp *ndpState) rememberDefaultRouter(ip tcpip.Address, rl time.Duration) {
|
||||
//
|
||||
// The IPv6 endpoint that ndp belongs to MUST be locked.
|
||||
func (ndp *ndpState) rememberOnLinkPrefix(prefix tcpip.Subnet, l time.Duration) {
|
||||
ndpDisp := ndp.ep.protocol.ndpDisp
|
||||
ndpDisp := ndp.ep.protocol.options.NDPDisp
|
||||
if ndpDisp == nil {
|
||||
return
|
||||
}
|
||||
@@ -1047,7 +1047,7 @@ func (ndp *ndpState) invalidateOnLinkPrefix(prefix tcpip.Subnet) {
|
||||
delete(ndp.onLinkPrefixes, prefix)
|
||||
|
||||
// Let the integrator know a discovered on-link prefix is invalidated.
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnOnLinkPrefixInvalidated(ndp.ep.nic.ID(), prefix)
|
||||
}
|
||||
}
|
||||
@@ -1225,7 +1225,7 @@ func (ndp *ndpState) doSLAAC(prefix tcpip.Subnet, pl, vl time.Duration) {
|
||||
// The IPv6 endpoint that ndp belongs to MUST be locked.
|
||||
func (ndp *ndpState) addAndAcquireSLAACAddr(addr tcpip.AddressWithPrefix, configType stack.AddressConfigType, deprecated bool) stack.AddressEndpoint {
|
||||
// Inform the integrator that we have a new SLAAC address.
|
||||
ndpDisp := ndp.ep.protocol.ndpDisp
|
||||
ndpDisp := ndp.ep.protocol.options.NDPDisp
|
||||
if ndpDisp == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -1272,7 +1272,7 @@ func (ndp *ndpState) generateSLAACAddr(prefix tcpip.Subnet, state *slaacPrefixSt
|
||||
}
|
||||
|
||||
dadCounter := state.generationAttempts + state.stableAddr.localGenerationFailures
|
||||
if oIID := ndp.ep.protocol.opaqueIIDOpts; oIID.NICNameFromID != nil {
|
||||
if oIID := ndp.ep.protocol.options.OpaqueIIDOpts; oIID.NICNameFromID != nil {
|
||||
addrBytes = header.AppendOpaqueInterfaceIdentifier(
|
||||
addrBytes[:header.IIDOffsetInIPv6Address],
|
||||
prefix,
|
||||
@@ -1676,7 +1676,7 @@ func (ndp *ndpState) deprecateSLAACAddress(addressEndpoint stack.AddressEndpoint
|
||||
}
|
||||
|
||||
addressEndpoint.SetDeprecated(true)
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnAutoGenAddressDeprecated(ndp.ep.nic.ID(), addressEndpoint.AddressWithPrefix())
|
||||
}
|
||||
}
|
||||
@@ -1701,7 +1701,7 @@ func (ndp *ndpState) invalidateSLAACPrefix(prefix tcpip.Subnet, state slaacPrefi
|
||||
//
|
||||
// The IPv6 endpoint that ndp belongs to MUST be locked.
|
||||
func (ndp *ndpState) cleanupSLAACAddrResourcesAndNotify(addr tcpip.AddressWithPrefix, invalidatePrefix bool) {
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnAutoGenAddressInvalidated(ndp.ep.nic.ID(), addr)
|
||||
}
|
||||
|
||||
@@ -1761,7 +1761,7 @@ func (ndp *ndpState) invalidateTempSLAACAddr(tempAddrs map[tcpip.Address]tempSLA
|
||||
//
|
||||
// The IPv6 endpoint that ndp belongs to MUST be locked.
|
||||
func (ndp *ndpState) cleanupTempSLAACAddrResourcesAndNotify(addr tcpip.AddressWithPrefix, invalidateAddr bool) {
|
||||
if ndpDisp := ndp.ep.protocol.ndpDisp; ndpDisp != nil {
|
||||
if ndpDisp := ndp.ep.protocol.options.NDPDisp; ndpDisp != nil {
|
||||
ndpDisp.OnAutoGenAddressInvalidated(ndp.ep.nic.ID(), addr)
|
||||
}
|
||||
|
||||
@@ -2005,7 +2005,7 @@ func (ndp *ndpState) stopSolicitingRouters() {
|
||||
// initializeTempAddrState initializes state related to temporary SLAAC
|
||||
// addresses.
|
||||
func (ndp *ndpState) initializeTempAddrState() {
|
||||
header.InitialTempIID(ndp.temporaryIIDHistory[:], ndp.ep.protocol.tempIIDSeed, ndp.ep.nic.ID())
|
||||
header.InitialTempIID(ndp.temporaryIIDHistory[:], ndp.ep.protocol.options.TempIIDSeed, ndp.ep.nic.ID())
|
||||
|
||||
if MaxDesyncFactor != 0 {
|
||||
ndp.temporaryAddressDesyncFactor = time.Duration(rand.Int63n(int64(MaxDesyncFactor)))
|
||||
|
||||
@@ -2162,8 +2162,8 @@ func TestNoAutoGenTempAddrForLinkLocal(t *testing.T) {
|
||||
NDPConfigs: ipv6.NDPConfigurations{
|
||||
AutoGenTempGlobalAddresses: true,
|
||||
},
|
||||
NDPDisp: &ndpDisp,
|
||||
AutoGenIPv6LinkLocal: true,
|
||||
NDPDisp: &ndpDisp,
|
||||
AutoGenLinkLocal: true,
|
||||
})},
|
||||
})
|
||||
|
||||
@@ -4044,9 +4044,9 @@ func TestAutoGenAddrInResponseToDADConflicts(t *testing.T) {
|
||||
ndpConfigs.AutoGenAddressConflictRetries = maxRetries
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
AutoGenIPv6LinkLocal: addrType.autoGenLinkLocal,
|
||||
NDPConfigs: ndpConfigs,
|
||||
NDPDisp: &ndpDisp,
|
||||
AutoGenLinkLocal: addrType.autoGenLinkLocal,
|
||||
NDPConfigs: ndpConfigs,
|
||||
NDPDisp: &ndpDisp,
|
||||
OpaqueIIDOpts: ipv6.OpaqueInterfaceIdentifierOptions{
|
||||
NICNameFromID: func(_ tcpip.NICID, nicName string) string {
|
||||
return nicName
|
||||
@@ -4179,9 +4179,9 @@ func TestAutoGenAddrWithEUI64IIDNoDADRetries(t *testing.T) {
|
||||
e := channel.New(0, 1280, linkAddr1)
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
AutoGenIPv6LinkLocal: addrType.autoGenLinkLocal,
|
||||
NDPConfigs: addrType.ndpConfigs,
|
||||
NDPDisp: &ndpDisp,
|
||||
AutoGenLinkLocal: addrType.autoGenLinkLocal,
|
||||
NDPConfigs: addrType.ndpConfigs,
|
||||
NDPDisp: &ndpDisp,
|
||||
})},
|
||||
})
|
||||
if err := s.CreateNIC(nicID, e); err != nil {
|
||||
@@ -4708,7 +4708,7 @@ func TestCleanupNDPState(t *testing.T) {
|
||||
}
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
AutoGenIPv6LinkLocal: true,
|
||||
AutoGenLinkLocal: true,
|
||||
NDPConfigs: ipv6.NDPConfigurations{
|
||||
HandleRAs: true,
|
||||
DiscoverDefaultRouters: true,
|
||||
|
||||
@@ -2407,9 +2407,9 @@ func TestNICAutoGenLinkLocalAddr(t *testing.T) {
|
||||
}
|
||||
opts := stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
AutoGenIPv6LinkLocal: test.autoGen,
|
||||
NDPDisp: &ndpDisp,
|
||||
OpaqueIIDOpts: test.iidOpts,
|
||||
AutoGenLinkLocal: test.autoGen,
|
||||
NDPDisp: &ndpDisp,
|
||||
OpaqueIIDOpts: test.iidOpts,
|
||||
})},
|
||||
}
|
||||
|
||||
@@ -2502,8 +2502,8 @@ func TestNoLinkLocalAutoGenForLoopbackNIC(t *testing.T) {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
opts := stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
AutoGenIPv6LinkLocal: true,
|
||||
OpaqueIIDOpts: test.opaqueIIDOpts,
|
||||
AutoGenLinkLocal: true,
|
||||
OpaqueIIDOpts: test.opaqueIIDOpts,
|
||||
})},
|
||||
}
|
||||
|
||||
@@ -2536,9 +2536,9 @@ func TestNICAutoGenAddrDoesDAD(t *testing.T) {
|
||||
ndpConfigs := ipv6.DefaultNDPConfigurations()
|
||||
opts := stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
NDPConfigs: ndpConfigs,
|
||||
AutoGenIPv6LinkLocal: true,
|
||||
NDPDisp: &ndpDisp,
|
||||
NDPConfigs: ndpConfigs,
|
||||
AutoGenLinkLocal: true,
|
||||
NDPDisp: &ndpDisp,
|
||||
})},
|
||||
}
|
||||
|
||||
|
||||
@@ -71,8 +71,8 @@ func TestInitialLoopbackAddresses(t *testing.T) {
|
||||
|
||||
s := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocolWithOptions(ipv6.Options{
|
||||
NDPDisp: &ndpDispatcher{},
|
||||
AutoGenIPv6LinkLocal: true,
|
||||
NDPDisp: &ndpDispatcher{},
|
||||
AutoGenLinkLocal: true,
|
||||
OpaqueIIDOpts: ipv6.OpaqueInterfaceIdentifierOptions{
|
||||
NICNameFromID: func(nicID tcpip.NICID, nicName string) string {
|
||||
t.Fatalf("should not attempt to get name for NIC with ID = %d; nicName = %s", nicID, nicName)
|
||||
|
||||
Reference in New Issue
Block a user