diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2015-10-27 08:06:17 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-10-27 08:06:17 +0000 |
commit | 82003283a2679a21d91502e66765605254a7a1bb (patch) | |
tree | 6583265f3837885a0c285ea77f94cf6a5e5660cc | |
parent | f6dc5650be488bbf50b53a9344ca9ed32ec46313 (diff) | |
parent | 0b07cb03976bf7e138620af0a055a762652e670e (diff) | |
download | extras-82003283a2679a21d91502e66765605254a7a1bb.tar.gz |
Merge "Add a test for timewait crash."
-rwxr-xr-x | tests/net_test/multinetwork_test.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/net_test/multinetwork_test.py b/tests/net_test/multinetwork_test.py index ce9ce070..34ee365d 100755 --- a/tests/net_test/multinetwork_test.py +++ b/tests/net_test/multinetwork_test.py @@ -1108,5 +1108,76 @@ class RulesTest(net_test.NetworkTest): self.assertEquals(301, attributes[0]["FRA_TABLE"]) +class TcpTest(multinetwork_base.MultiNetworkBaseTest): + + TCP_TIME_WAIT = 6 + + def setUp(self): + # Pick an interface to send traffic on and two to forward traffic between. + self.netid, self.iface1, self.iface2 = random.sample(self.tuns.keys(), 3) + for netid in self.tuns: + iface = self.GetInterfaceName(netid) + self.SetSysctl("/proc/sys/net/ipv6/conf/%s/accept_ra" % iface, 2) + self.SetSysctl("/proc/sys/net/ipv6/conf/all/forwarding", 1) + self.iproute.IifRule(6, True, + self.GetInterfaceName(self.iface1), + self._TableForNetid(self.iface2), self.PRIORITY_IIF) + + def tearDown(self): + for netid in self.tuns: + iface = self.GetInterfaceName(netid) + self.SetSysctl("/proc/sys/net/ipv6/conf/%s/accept_ra" % iface, 0) + self.SetSysctl("/proc/sys/net/ipv6/conf/all/forwarding", 0) + self.iproute.IifRule(6, False, + self.GetInterfaceName(self.iface1), + self._TableForNetid(self.iface2), self.PRIORITY_IIF) + + def testCrash(self): + listenport = Packets.RandomPort() + self.listensocket = net_test.IPv6TCPSocket() + self.listensocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) + self.listensocket.bind(("::", listenport)) + self.listensocket.listen(100) + self.SetSocketMark(self.listensocket, self.netid) + + version = 6 + remoteaddr = self.GetRemoteAddress(version) + myaddr = self.MyAddress(version, self.netid) + + desc, syn = Packets.SYN(listenport, version, remoteaddr, myaddr) + synack_desc, synack = Packets.SYNACK(version, myaddr, remoteaddr, syn) + msg = "Sent %s, expected %s" % (desc, synack_desc) + reply = self._ReceiveAndExpectResponse(self.netid, syn, synack, msg) + + establishing_ack = Packets.ACK(version, remoteaddr, myaddr, reply)[1] + self.ReceivePacketOn(self.netid, establishing_ack) + accepted, peer = self.listensocket.accept() + remoteport = accepted.getpeername()[1] + + accepted.close() + desc, fin = Packets.FIN(version, myaddr, remoteaddr, establishing_ack) + self.ExpectPacketOn(self.netid, msg + ": expecting %s after close" % desc, fin) + + desc, finack = Packets.FIN(version, remoteaddr, myaddr, fin) + self.ReceivePacketOn(self.netid, finack) + + # Check our socket is now in TIME_WAIT. + sockets = self.ReadProcNetSocket("tcp6") + mysrc = "%s:%04X" % (net_test.FormatSockStatAddress(myaddr), listenport) + mydst = "%s:%04X" % (net_test.FormatSockStatAddress(remoteaddr), remoteport) + state = None + sockets = [s for s in sockets if s[0] == mysrc and s[1] == mydst] + self.assertEquals(1, len(sockets)) + self.assertEquals("%02X" % self.TCP_TIME_WAIT, sockets[0][2]) + + # Remove our IP address. + self.iproute.DelAddress(myaddr, 64, self.ifindices[self.netid]) + + self.ReceivePacketOn(self.iface1, finack) + self.ReceivePacketOn(self.iface1, establishing_ack) + self.ReceivePacketOn(self.iface1, establishing_ack) + # No crashes? Good. + + if __name__ == "__main__": unittest.main() |