summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorErik Kline <ek@google.com>2014-12-17 14:10:51 +0900
committerLorenzo Colitti <lorenzo@google.com>2015-02-02 17:47:30 +0900
commit90fdc21936e7e5f555e73fe9c3555d1f156617b0 (patch)
treea0f9f020b7bced3402857c9b2fda9358f2376611 /tests
parenta014279741d26eb857e6f5a01c5d2fc040cf7b8f (diff)
downloadextras-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-xtests/net_test/srcaddr_selection_test.py49
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.