mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Do not assume no DHCPv6 configurations
Do not assume that networks need any DHCPv6 configurations. Instead, notify the NDP dispatcher in response to the first NDP RA's DHCPv6 flags, even if the flags indicate no DHCPv6 configurations are available. PiperOrigin-RevId: 310245068
This commit is contained in:
committed by
gVisor bot
parent
279f1eb7ab
commit
485ca36adf
@@ -12,7 +12,7 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by "stringer -type=DHCPv6ConfigurationFromNDPRA"; DO NOT EDIT.
|
||||
// Code generated by "stringer -type DHCPv6ConfigurationFromNDPRA"; DO NOT EDIT.
|
||||
|
||||
package stack
|
||||
|
||||
@@ -22,9 +22,9 @@ func _() {
|
||||
// An "invalid array index" compiler error signifies that the constant values have changed.
|
||||
// Re-run the stringer command to generate them again.
|
||||
var x [1]struct{}
|
||||
_ = x[DHCPv6NoConfiguration-0]
|
||||
_ = x[DHCPv6ManagedAddress-1]
|
||||
_ = x[DHCPv6OtherConfigurations-2]
|
||||
_ = x[DHCPv6NoConfiguration-1]
|
||||
_ = x[DHCPv6ManagedAddress-2]
|
||||
_ = x[DHCPv6OtherConfigurations-3]
|
||||
}
|
||||
|
||||
const _DHCPv6ConfigurationFromNDPRA_name = "DHCPv6NoConfigurationDHCPv6ManagedAddressDHCPv6OtherConfigurations"
|
||||
@@ -32,8 +32,9 @@ const _DHCPv6ConfigurationFromNDPRA_name = "DHCPv6NoConfigurationDHCPv6ManagedAd
|
||||
var _DHCPv6ConfigurationFromNDPRA_index = [...]uint8{0, 21, 41, 66}
|
||||
|
||||
func (i DHCPv6ConfigurationFromNDPRA) String() string {
|
||||
i -= 1
|
||||
if i < 0 || i >= DHCPv6ConfigurationFromNDPRA(len(_DHCPv6ConfigurationFromNDPRA_index)-1) {
|
||||
return "DHCPv6ConfigurationFromNDPRA(" + strconv.FormatInt(int64(i), 10) + ")"
|
||||
return "DHCPv6ConfigurationFromNDPRA(" + strconv.FormatInt(int64(i+1), 10) + ")"
|
||||
}
|
||||
return _DHCPv6ConfigurationFromNDPRA_name[_DHCPv6ConfigurationFromNDPRA_index[i]:_DHCPv6ConfigurationFromNDPRA_index[i+1]]
|
||||
}
|
||||
|
||||
@@ -199,9 +199,11 @@ var (
|
||||
type DHCPv6ConfigurationFromNDPRA int
|
||||
|
||||
const (
|
||||
_ DHCPv6ConfigurationFromNDPRA = iota
|
||||
|
||||
// DHCPv6NoConfiguration indicates that no configurations are available via
|
||||
// DHCPv6.
|
||||
DHCPv6NoConfiguration DHCPv6ConfigurationFromNDPRA = iota
|
||||
DHCPv6NoConfiguration
|
||||
|
||||
// DHCPv6ManagedAddress indicates that addresses are available via DHCPv6.
|
||||
//
|
||||
@@ -315,9 +317,6 @@ type NDPDispatcher interface {
|
||||
// OnDHCPv6Configuration will be called with an updated configuration that is
|
||||
// available via DHCPv6 for a specified NIC.
|
||||
//
|
||||
// NDPDispatcher assumes that the initial configuration available by DHCPv6 is
|
||||
// DHCPv6NoConfiguration.
|
||||
//
|
||||
// This function is not permitted to block indefinitely. It must not
|
||||
// call functions on the stack itself.
|
||||
OnDHCPv6Configuration(tcpip.NICID, DHCPv6ConfigurationFromNDPRA)
|
||||
@@ -1808,6 +1807,8 @@ func (ndp *ndpState) cleanupState(hostOnly bool) {
|
||||
if got := len(ndp.defaultRouters); got != 0 {
|
||||
panic(fmt.Sprintf("ndp: still have discovered default routers after cleaning up; found = %d", got))
|
||||
}
|
||||
|
||||
ndp.dhcpv6Configuration = 0
|
||||
}
|
||||
|
||||
// startSolicitingRouters starts soliciting routers, as per RFC 4861 section
|
||||
|
||||
@@ -4888,7 +4888,12 @@ func TestDHCPv6ConfigurationFromNDPDA(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// The initial DHCPv6 configuration should be stack.DHCPv6NoConfiguration.
|
||||
// Even if the first RA reports no DHCPv6 configurations are available, the
|
||||
// dispatcher should get an event.
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, false))
|
||||
expectDHCPv6Event(stack.DHCPv6NoConfiguration)
|
||||
// Receiving the same update again should not result in an event to the
|
||||
// dispatcher.
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, false))
|
||||
expectNoDHCPv6Event()
|
||||
|
||||
@@ -4896,8 +4901,6 @@ func TestDHCPv6ConfigurationFromNDPDA(t *testing.T) {
|
||||
// Configurations.
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, true))
|
||||
expectDHCPv6Event(stack.DHCPv6OtherConfigurations)
|
||||
// Receiving the same update again should not result in an event to the
|
||||
// NDPDispatcher.
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, true))
|
||||
expectNoDHCPv6Event()
|
||||
|
||||
@@ -4933,6 +4936,21 @@ func TestDHCPv6ConfigurationFromNDPDA(t *testing.T) {
|
||||
expectDHCPv6Event(stack.DHCPv6OtherConfigurations)
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, true))
|
||||
expectNoDHCPv6Event()
|
||||
|
||||
// Cycling the NIC should cause the last DHCPv6 configuration to be cleared.
|
||||
if err := s.DisableNIC(nicID); err != nil {
|
||||
t.Fatalf("s.DisableNIC(%d): %s", nicID, err)
|
||||
}
|
||||
if err := s.EnableNIC(nicID); err != nil {
|
||||
t.Fatalf("s.EnableNIC(%d): %s", nicID, err)
|
||||
}
|
||||
|
||||
// Receive an RA that updates the DHCPv6 configuration to Other
|
||||
// Configurations.
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, true))
|
||||
expectDHCPv6Event(stack.DHCPv6OtherConfigurations)
|
||||
e.InjectInbound(header.IPv6ProtocolNumber, raBufWithDHCPv6(llAddr2, false, true))
|
||||
expectNoDHCPv6Event()
|
||||
}
|
||||
|
||||
// TestRouterSolicitation tests the initial Router Solicitations that are sent
|
||||
|
||||
Reference in New Issue
Block a user