diff options
author | Erik Kline <ek@google.com> | 2014-12-17 14:10:51 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2015-02-02 17:47:30 +0900 |
commit | 90fdc21936e7e5f555e73fe9c3555d1f156617b0 (patch) | |
tree | a0f9f020b7bced3402857c9b2fda9358f2376611 /tests | |
parent | a014279741d26eb857e6f5a01c5d2fc040cf7b8f (diff) | |
download | extras-90fdc21936e7e5f555e73fe9c3555d1f156617b0.tar.gz |
Verify no NSes from optimistic addresses
- also, fixup tests to skip at more appropriate times.
Change-Id: Ib7df5a176a30a9e31e403883d52cd0d41b4475ae
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/net_test/srcaddr_selection_test.py | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/tests/net_test/srcaddr_selection_test.py b/tests/net_test/srcaddr_selection_test.py index 535a4779..6655bb7b 100755 --- a/tests/net_test/srcaddr_selection_test.py +++ b/tests/net_test/srcaddr_selection_test.py @@ -1,6 +1,7 @@ #!/usr/bin/python import errno +import os import random from socket import * # pylint: disable=wildcard-import import time @@ -18,6 +19,11 @@ IPV6_ADDR_PREFERENCES = 72 IPV6_PREFER_SRC_PUBLIC = 0x0002 +USE_OPTIMISTIC_SYSCTL = "/proc/sys/net/ipv6/conf/default/use_optimistic" + +HAVE_USE_OPTIMISTIC = os.path.isfile(USE_OPTIMISTIC_SYSCTL) + + class IPv6SourceAddressSelectionTest(mark_test.MultiNetworkTest): def SetDAD(self, ifname, value): @@ -63,11 +69,11 @@ class IPv6SourceAddressSelectionTest(mark_test.MultiNetworkTest): s = net_test.UDPSocket(AF_INET6) s.bind((address, 0, 0, 0)) - def SendWithSourceAddress(self, address, netid): + def SendWithSourceAddress(self, address, netid, dest=net_test.IPV6_ADDR): pktinfo = mark_test.MakePktInfo(6, address, 0) cmsgs = [(net_test.SOL_IPV6, IPV6_PKTINFO, pktinfo)] s = self.BuildSocket(6, net_test.UDPSocket, netid, "mark") - return sendmsg.Sendmsg(s, (net_test.IPV6_ADDR, 53), "Hello", cmsgs, 0) + return sendmsg.Sendmsg(s, (dest, 53), "Hello", cmsgs, 0) def assertAddressUsable(self, address, netid): self.BindToAddress(address) @@ -102,7 +108,8 @@ class MultiInterfaceSourceAddressSelectionTest(IPv6SourceAddressSelectionTest): self.SetDAD(self.GetInterfaceName(netid), 0) self.SetOptimisticDAD(self.GetInterfaceName(netid), 0) self.SetUseTempaddrs(self.GetInterfaceName(netid), 0) - self.SetUseOptimistic(self.GetInterfaceName(netid), 0) + if HAVE_USE_OPTIMISTIC: + self.SetUseOptimistic(self.GetInterfaceName(netid), 0) # [1] Pick an interface on which to test. self.test_netid = random.choice(self.tuns.keys()) @@ -155,7 +162,7 @@ class OptimisticAddressTest(MultiInterfaceSourceAddressSelectionTest): self.test_ip, self.test_ifindex, iproute.IFA_F_OPTIMISTIC) # Optimistic addresses are usable but are not selected. - if mark_test.LinuxVersion() >= (3, 19, 0): + if mark_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) @@ -172,6 +179,7 @@ class OptimisticAddressTest(MultiInterfaceSourceAddressSelectionTest): class OptimisticAddressOkayTest(MultiInterfaceSourceAddressSelectionTest): + @unittest.skipUnless(HAVE_USE_OPTIMISTIC, "use_optimistic not supported") def testModifiedRfc6724Behaviour(self): # [3] Get an IPv6 address back, in optimistic DAD start-up. self.SetDAD(self.test_ifname, 1) # Enable DAD @@ -191,6 +199,7 @@ class OptimisticAddressOkayTest(MultiInterfaceSourceAddressSelectionTest): class ValidBeforeOptimisticTest(MultiInterfaceSourceAddressSelectionTest): + @unittest.skipUnless(HAVE_USE_OPTIMISTIC, "use_optimistic not supported") def testModifiedRfc6724Behaviour(self): # [3] Add a valid IPv6 address to this interface and verify it is # selected as the source address. @@ -219,6 +228,7 @@ class ValidBeforeOptimisticTest(MultiInterfaceSourceAddressSelectionTest): class DadFailureTest(MultiInterfaceSourceAddressSelectionTest): + @unittest.skipUnless(HAVE_USE_OPTIMISTIC, "use_optimistic not supported") def testDadFailure(self): # [3] Get an IPv6 address back, in optimistic DAD start-up. self.SetDAD(self.test_ifname, 1) # Enable DAD @@ -248,6 +258,37 @@ class DadFailureTest(MultiInterfaceSourceAddressSelectionTest): # TODO(ek): verify that an RTM_DELADDR issued for the DAD-failed address. +class NoNsFromOptimisticTest(MultiInterfaceSourceAddressSelectionTest): + + @unittest.skipUnless(HAVE_USE_OPTIMISTIC, "use_optimistic not supported") + @unittest.skipUnless(mark_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 = mark_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) + + # TODO(ek): add tests listening for netlink events. |