def testRfc6724Behaviour(self): # [3] Get an IPv6 address back, in optimistic DAD start-up. self.SetDAD(self.test_ifname, 1) # Enable DAD self.SetOptimisticDAD(self.test_ifname, 1) # Send a RA to start SLAAC and subsequent DAD. self.SendRA(self.test_netid, 0) # Get flags and prove optimism. self.assertAddressHasExpectedAttributes(self.test_ip, self.test_ifindex, iproute.IFA_F_OPTIMISTIC) # Optimistic addresses are usable but are not selected. if net_test.LinuxVersion() >= (3, 18, 0): # The version checked in to android kernels <= 3.10 requires the # use_optimistic sysctl to be turned on. self.assertAddressUsable(self.test_ip, self.test_netid) self.assertAddressNotSelected(self.test_ip, self.test_netid) # Busy wait for DAD to complete (should be less than 1 second). self.WaitForDad(self.test_ip) # The test_ip should have completed DAD by now, and should be the # chosen source address. self.assertAddressUsable(self.test_ip, self.test_netid) self.assertAddressSelected(self.test_ip, self.test_netid)
def testSendToOnlinkDestination(self): # [3] Get an IPv6 address back, in optimistic DAD start-up. self.SetDAD(self.test_ifname, 1) # Enable DAD self.SetOptimisticDAD(self.test_ifname, 1) self.SetUseOptimistic(self.test_ifname, 1) # Send a RA to start SLAAC and subsequent DAD. self.SendRA(self.test_netid, 0) # Prove optimism and usability. self.assertAddressHasExpectedAttributes(self.test_ip, self.test_ifindex, iproute.IFA_F_OPTIMISTIC) self.assertAddressUsable(self.test_ip, self.test_netid) self.assertAddressSelected(self.test_ip, self.test_netid) # [4] Send to an on-link destination and observe a Neighbor Solicitation # packet with a source address that is NOT the optimistic address. # In this setup, the only usable address is the link-local address. onlink_dest = self.GetRandomDestination( self.IPv6Prefix(self.test_netid)) self.SendWithSourceAddress(self.test_ip, self.test_netid, onlink_dest) if net_test.LinuxVersion() >= (3, 18, 0): # Older versions will actually choose the optimistic address to # originate Neighbor Solications (RFC violation). expected_ns = packets.NS(self.test_lladdr, onlink_dest, self.MyMacAddress(self.test_netid))[1] self.ExpectPacketOn(self.test_netid, "link-local NS", expected_ns)
class NoNsFromOptimisticTest(MultiInterfaceSourceAddressSelectionTest): @unittest.skipUnless(HAVE_USE_OPTIMISTIC, "use_optimistic not supported") @unittest.skipUnless(net_test.LinuxVersion() >= (3, 18, 0), "correct optimistic bind() not supported") def testSendToOnlinkDestination(self): # [3] Get an IPv6 address back, in optimistic DAD start-up. self.SetDAD(self.test_ifname, 1) # Enable DAD self.SetOptimisticDAD(self.test_ifname, 1) self.SetUseOptimistic(self.test_ifname, 1) # Send a RA to start SLAAC and subsequent DAD. self.SendRA(self.test_netid, 0) # Prove optimism and usability. self.assertAddressHasExpectedAttributes(self.test_ip, self.test_ifindex, iproute.IFA_F_OPTIMISTIC) self.assertAddressUsable(self.test_ip, self.test_netid) self.assertAddressSelected(self.test_ip, self.test_netid) # [4] Send to an on-link destination and observe a Neighbor Solicitation # packet with a source address that is NOT the optimistic address. # In this setup, the only usable address is the link-local address. onlink_dest = self.GetRandomDestination( self.IPv6Prefix(self.test_netid)) self.SendWithSourceAddress(self.test_ip, self.test_netid, onlink_dest) expected_ns = multinetwork_test.Packets.NS( net_test.GetLinkAddress(self.test_ifname, True), onlink_dest, self.MyMacAddress(self.test_netid))[1] self.ExpectPacketOn(self.test_netid, "link-local NS", expected_ns)