Index: etc/mtree/BSD.tests.dist =================================================================== --- etc/mtree/BSD.tests.dist +++ etc/mtree/BSD.tests.dist @@ -754,6 +754,10 @@ .. netinet .. + netinet6 + frag6 + .. + .. netipsec tunnel .. Index: tests/sys/netinet6/Makefile =================================================================== --- /dev/null +++ tests/sys/netinet6/Makefile @@ -0,0 +1,41 @@ +# $FreeBSD$ + +PACKAGE= tests + +TESTSDIR= ${TESTSBASE}/sys/netinet6 +ATF_TESTS_SH+= fragmentation +TEST_METADATA.fragmentation+= required_programs="python2.7 scapy" +TEST_METADATA.fragmentation+= required_user="root" + +${PACKAGE}FILES+= utils.subr \ + frag6/frag6_overhead0.py \ + frag6/frag6_overhead1.py \ + frag6/frag6_mf0long.py \ + frag6/frag6_ext.py \ + frag6/frag6_mf0middle.py \ + frag6/frag6_mf1end.py \ + frag6/frag6.py \ + frag6/frag6_udpatomic.py \ + frag6/frag6_overdrop.py \ + frag6/frag6_refrag.py \ + frag6/frag6_zerofirst.py \ + frag6/frag6_overtail0.py \ + frag6/frag6_overhead.py \ + frag6/frag6_permute.py \ + frag6/frag6_udppayload.py \ + frag6/frag6_opt.py \ + frag6/frag6_overtail1.py \ + frag6/frag6_zerosecond.py \ + frag6/frag6_queuelimit.py \ + frag6/frag6_hop.py \ + frag6/frag6_mf0short.py \ + frag6/frag6_shortatomic.py \ + frag6/frag6_udpheader.py \ + frag6/frag6_overtail.py \ + frag6/frag6_overatomic.py \ + frag6/frag6_mf0atomic.py \ + frag6/frag6_maxlen.py \ + frag6/frag6_timeout.py \ + frag6/frag6_padding.py + +.include Index: tests/sys/netinet6/Makefile.depend =================================================================== --- /dev/null +++ tests/sys/netinet6/Makefile.depend @@ -0,0 +1,11 @@ +# $FreeBSD$ +# Autogenerated - do NOT edit! + +DIRDEPS = \ + + +.include + +.if ${DEP_RELDIR} == ${_DEP_RELDIR} +# local dependencies - needed for -jN in clean tree +.endif Index: tests/sys/netinet6/frag6/LICENSE =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/LICENSE @@ -0,0 +1,13 @@ +# Copyright (c) 2012-2017 Alexander Bluhm +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Index: tests/sys/netinet6/frag6/frag6.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "non-overlapping ping6 fragments" + +# |--------| +# |----| + +import os +from addr import * +from scapy.all import * + +print(LOCAL_ADDR6) +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_ext.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_ext.py @@ -0,0 +1,51 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragments with hop-by-hop extension header before fragment header" + +# E|---------| +# E|----| + +import os +from addr import * +from scapy.all import * + +print(LOCAL_ADDR6) + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/IPv6ExtHdrHopByHop()/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_hop.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_hop.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragments with missplaced hop-by-hop extension header" + +# |HHHH----------| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/IPv6ExtHdrHopByHop()/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=0, id=fid, m=1)/str(packet)[40:64]) +frag.append(IPv6ExtHdrFragment(nh=0, id=fid, offset=3)/str(packet)[64:72]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_maxlen.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_maxlen.py @@ -0,0 +1,64 @@ +#!/usr/local/bin/python2.7 + +print "fully fragmented maximum size ping6 packet, sent in random order" + +# |----| +# |----| +# |----| +# |----| +# |----| + +import os +import random +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +iplen=2**16 +size=424 +payload="ABCDEFGHIJKLMNOP" * (iplen / 16) +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=str(payload)[0:iplen-8-1]) +frag=[] +fid=pid & 0xffffffff +max=iplen/size +for i in range(max): + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1, + offset=i*(size/8))/str(packet)[40+i*size:40+(i+1)*size]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, + offset=max*(size/8))/str(packet)[40+max*size:]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +child = os.fork() +if child == 0: + time.sleep(1) + randeth=eth + random.shuffle(randeth) + for e in randeth: + sendp(e, iface=LOCAL_IF) + time.sleep(0.001) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=10, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and proto ipv6-frag") +os.kill(child, 15) +os.wait() + +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'Fragment Header' and \ + a.payload.payload.offset == 0 and \ + ipv6nh[a.payload.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + exit(0) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_mf0atomic.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_mf0atomic.py @@ -0,0 +1,51 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragments with an atomic fragment with mf=0 overlapping" + +# |---------| +# |XXXX| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_mf0long.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_mf0long.py @@ -0,0 +1,53 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps longer than the last fragment with m=0" + +# |---------| +# |XXXX| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +dummy="01234567" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=3)/dummy) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:48]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_mf0middle.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_mf0middle.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment with mf=0 that overlaps the first fragment" + +# |---------| +# |XXXX| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_mf0short.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_mf0short.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment with m=0 that overlaps the last fragment at beginning" + +# |---------| +# |XXXXXXXXX| +# |---------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOPQRSTUVWX" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:72]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_mf1end.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_mf1end.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment with mf=1 that overlaps fragment with mf=0 at the end" + +# |----| +# |XXXXXXXXX| +# |---------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_opt.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_opt.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragments with fragmented destination option" + +# |OOOO| +# |OOOOOOOOOO--------------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/IPv6ExtHdrDestOpt( \ + options=PadN(optdata='\0'*12)/PadN(optdata='\0'*6))/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=60, id=fid, m=1)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=60, id=fid, offset=1)/str(packet)[48:88]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_overatomic.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overatomic.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "atomic fragment with offset=0 and more=0, it must be processed" + +# |XXXXXXXX| +# |-------------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +dummy="0123456701234567" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/dummy) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid)/str(packet)[40:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_overdrop.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overdrop.py @@ -0,0 +1,56 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps the first fragment with the head" + +# |---------| +# |XXXXXXXXX| +# |----| +# |----| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +dummy="0123456701234567" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/dummy) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_overhead.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overhead.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps the second fragment with its head" + +# |----| +# |----| +# |XXXX-----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_overhead0.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overhead0.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps the first fragment with its head" + +# |---------| +# |XXXX-----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_overhead1.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overhead1.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment head that overlaps the first fragment completely" + +# |---------| +# |XXXX| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_overtail.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overtail.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps the last fragment with its tail" + +# |----| +# |XXXX| +# |---------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_overtail0.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overtail0.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment that overlaps the fist fragment with its tail" + +# |XXXX-----| +# |---------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_overtail1.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_overtail1.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment tail that overlaps the first fragment completely" + +# |---------| +# |XXXX| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/str(packet)[48:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:48]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_padding.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_padding.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "non-overlapping ping6 fragments with ethernet padding" + +# |--------|XX| +# |----|XX| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +padding="0123" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=str(IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f) + padding + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC, type=0x86dd)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_permute.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_permute.py @@ -0,0 +1,65 @@ +#!/usr/local/bin/python2.7 + +print "send 3 non-overlapping ping6 fragments in all possible orders" + +# |----| +# |----| +# |----| + +import os +from addr import * +from scapy.all import * + +permute=[] +permute.append([0,1,2]) +permute.append([0,2,1]) +permute.append([1,0,2]) +permute.append([2,0,1]) +permute.append([1,2,0]) +permute.append([2,1,0]) + +pid=os.getpid() +payload="ABCDEFGHIJKLMNOP" +for p in permute: + pid += 1 + eid=pid & 0xffff + packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) + frag=[] + fid=pid & 0xffffffff + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/ + str(packet)[40:48]) + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/ + str(packet)[48:56]) + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/ + str(packet)[56:64]) + eth=[] + for i in range(3): + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/frag[p[i]] + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + + if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + + ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") + for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + break + print "PAYLOAD!=%s" % (payload) + exit(1) + else: + print "NO ECHO REPLY" + exit(2) Index: tests/sys/netinet6/frag6/frag6_queuelimit.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_queuelimit.py @@ -0,0 +1,71 @@ +#!/usr/local/bin/python2.7 + +print "drop too long fragment queue, reassemble less fragments" + +# |----| +# |----| +# |----| +# ... ... +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" * 70 +frag=[] +fid=pid & 0xffffffff +# send packets with 65 and 64 fragments +for max in (64, 63): + eid = ~eid & 0xffff + packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) + fid = ~fid & 0xffffffff + for i in range(max): + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1, + offset=i)/str(packet)[40+i*8:40+(i+1)*8]) + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, + offset=max)/str(packet)[40+max*8:]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +child = os.fork() +if child == 0: + time.sleep(1) + for e in eth: + sendp(e, iface=LOCAL_IF) + time.sleep(0.001) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=6, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +os.kill(child, 15) +os.wait() + +reply=False +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id == ~eid & 0xffff: + print "ECHO REPLY FROM 65 FRAGMENTS" + exit(1) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data != payload: + print "PAYLOAD!=%s" % (payload) + exit(2) + reply=True +if not reply: + print "NO ECHO REPLY FROM 64 FRAGMENTS" + exit(1) +exit(0) Index: tests/sys/netinet6/frag6/frag6_refrag.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_refrag.py @@ -0,0 +1,65 @@ +#!/usr/local/bin/python2.7 + +print "fragments of a large packet that has to be refragmented by reflector" + +# |--------| +# |------------------| +# ... +# |------------------| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload=100 * "ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +request_cksum=ICMPv6Unknown(str(packet.payload)).cksum +print "request cksum=%#x" % (request_cksum) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +offset=2 +chunk=4 +while 40+8*(offset+chunk) < len(payload): + frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=offset, m=1)/ + str(packet)[40+(8*offset):40+8*(offset+chunk)]) + offset+=chunk +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=offset)/ + str(packet)[40+(8*offset):]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and proto ipv6-frag") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'Fragment Header' and \ + a.payload.payload.offset == 0 and \ + ipv6nh[a.payload.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + reply_cksum=a.payload.payload.payload.cksum + print "reply cksum=%#x" % (reply_cksum) + # change request checksum incrementaly and check with reply + diff_cksum=~(~reply_cksum+~(~request_cksum+~0x8000+0x8100)) + if diff_cksum != -1: + print "CHECKSUM ERROR diff cksum=%#x" % (diff_cksum) + exit(1) + exit(0) +print "NO ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_shortatomic.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_shortatomic.py @@ -0,0 +1,51 @@ +#!/usr/local/bin/python2.7 + +print "fragment with dest option and atomic fragment without protocol header" + +# |-IP-|-Frag-|-ExtDest-|-ICMP6-|-pay| +# |-- atomic fragment --| +# |load-| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/IPv6ExtHdrDestOpt()/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=60, id=fid, m=1)/str(packet)[40:64]) +frag.append(IPv6ExtHdrFragment(nh=60, id=fid)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=60, id=fid, offset=3)/str(packet)[64:72]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_timeout.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_timeout.py @@ -0,0 +1,60 @@ +#!/usr/local/bin/python2.7 + +print "6 non-overlapping ping6 fragments in 75 seconds, timeout is 60" + +# |----| +# |----| +# |----| +# |----| +# |----| <--- timeout +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcd" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=1, m=1)/str(packet)[48:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2, m=1)/str(packet)[56:64]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=3, m=1)/str(packet)[64:72]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=4, m=1)/str(packet)[72:80]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=5)/str(packet)[80:88]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + for e in eth: + sendp(e, iface=LOCAL_IF) + time.sleep(15) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=90, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + print "ECHO REPLY" + exit(1) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "no echo reply" +exit(0) Index: tests/sys/netinet6/frag6/frag6_udpatomic.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_udpatomic.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python2.7 + +print "atomic udp fragment" + +# |-------------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +uport=pid & 0xffff +# inetd ignores UDP packets from privileged port or nfs +if uport < 1024 or uport == 2049: + uport+=1024 +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + UDP(sport=uport, dport=7)/payload +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=17, id=fid)/str(packet)[40:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and udp") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'UDP' and \ + a.payload.payload.sport == 7: + port=a.payload.payload.dport + print "port=%d" % (port) + if port != uport: + print "WRONG UDP ECHO REPLY PORT" + exit(2) + data=a.payload.payload.load + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO UDP ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_udpheader.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_udpheader.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "udp fragments splitted after udp header" + +# |----| +# |--------| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +uport=pid & 0xffff +# inetd ignores UDP packets from privileged port or nfs +if uport < 1024 or uport == 2049: + uport+=1024 +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + UDP(sport=uport, dport=7)/payload +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=17, id=fid, m=1)/str(packet)[40:48]) +frag.append(IPv6ExtHdrFragment(nh=17, id=fid, offset=1)/str(packet)[48:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and udp") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'UDP' and \ + a.payload.payload.sport == 7: + port=a.payload.payload.dport + print "port=%d" % (port) + if port != uport: + print "WRONG UDP ECHO REPLY PORT" + exit(2) + data=a.payload.payload.load + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO UDP ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_udppayload.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_udppayload.py @@ -0,0 +1,52 @@ +#!/usr/local/bin/python2.7 + +print "udp fragments with splitted payload" + +# |--------| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +uport=pid & 0xffff +# inetd ignores UDP packets from privileged port or nfs +if uport < 1024 or uport == 2049: + uport+=1024 +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + UDP(sport=uport, dport=7)/payload +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=17, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=17, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and udp") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'UDP' and \ + a.payload.payload.sport == 7: + port=a.payload.payload.dport + print "port=%d" % (port) + if port != uport: + print "WRONG UDP ECHO REPLY PORT" + exit(2) + data=a.payload.payload.load + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(1) +print "NO UDP ECHO REPLY" +exit(2) Index: tests/sys/netinet6/frag6/frag6_zerofirst.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_zerofirst.py @@ -0,0 +1,51 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment without payload with other proto before first fragment" + +# || +# |---------| +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=59, id=fid, m=1)) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/frag6/frag6_zerosecond.py =================================================================== --- /dev/null +++ tests/sys/netinet6/frag6/frag6_zerosecond.py @@ -0,0 +1,51 @@ +#!/usr/local/bin/python2.7 + +print "ping6 fragment without payload with other proto after first fragment" + +# |---------| +# || +# |----| + +import os +from addr import * +from scapy.all import * + +pid=os.getpid() +eid=pid & 0xffff +payload="ABCDEFGHIJKLMNOP" +packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \ + ICMPv6EchoRequest(id=eid, data=payload) +frag=[] +fid=pid & 0xffffffff +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, m=1)/str(packet)[40:56]) +frag.append(IPv6ExtHdrFragment(nh=59, id=fid, m=1)) +frag.append(IPv6ExtHdrFragment(nh=58, id=fid, offset=2)/str(packet)[56:64]) +eth=[] +for f in frag: + pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f + eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=LOCAL_IF) + os._exit(0) + +ans=sniff(iface=LOCAL_IF, timeout=3, filter= + "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") +for a in ans: + if a and a.type == ETH_P_IPV6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Echo Reply': + id=a.payload.payload.id + print "id=%#x" % (id) + if id != eid: + print "WRONG ECHO REPLY ID" + exit(2) + data=a.payload.payload.data + print "payload=%s" % (data) + if data == payload: + exit(0) + print "PAYLOAD!=%s" % (payload) + exit(2) +print "NO ECHO REPLY" +exit(1) Index: tests/sys/netinet6/fragmentation.sh =================================================================== --- /dev/null +++ tests/sys/netinet6/fragmentation.sh @@ -0,0 +1,413 @@ +# $FreeBSD$ + +. $(atf_get_srcdir)/utils.subr + +atf_test_case "frag6" "cleanup" + +frag6_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6.py' +} + +frag6_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_ext" "cleanup" + +frag6_ext_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_ext.py' +} + +frag6_ext_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_hop" "cleanup" + +frag6_hop_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_hop.py' +} + +frag6_hop_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_maxlen" "cleanup" + +frag6_maxlen_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_maxlen.py' +} + +frag6_maxlen_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_mf0atomic" "cleanup" + +frag6_mf0atomic_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_mf0atomic.py' +} + +frag6_mf0atomic_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_mf0long" "cleanup" + +frag6_mf0long_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_mf0long.py' +} + +frag6_mf0long_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_mf0middle" "cleanup" + +frag6_mf0middle_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_mf0middle.py' +} + +frag6_mf0middle_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_mf0short" "cleanup" + +frag6_mf0short_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_mf0short.py' +} + +frag6_mf0short_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_mf1end" "cleanup" + +frag6_mf1end_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_mf1end.py' +} + +frag6_mf1end_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_opt" "cleanup" + +frag6_opt_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_opt.py' +} + +frag6_opt_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overatomic" "cleanup" + +frag6_overatomic_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overatomic.py' +} + +frag6_overatomic_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overdrop" "cleanup" + +frag6_overdrop_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overdrop.py' +} + +frag6_overdrop_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overhead" "cleanup" + +frag6_overhead_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overhead.py' +} + +frag6_overhead_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overhead0" "cleanup" + +frag6_overhead0_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overhead0.py' +} + +frag6_overhead0_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overhead1" "cleanup" + +frag6_overhead1_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overhead1.py' +} + +frag6_overhead1_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overtail" "cleanup" + +frag6_overtail_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overtail.py' +} + +frag6_overtail_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overtail0" "cleanup" + +frag6_overtail0_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overtail0.py' +} + +frag6_overtail0_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_overtail1" "cleanup" + +frag6_overtail1_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_overtail1.py' +} + +frag6_overtail1_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_padding" "cleanup" + +frag6_padding_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_padding.py' +} + +frag6_padding_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_permute" "cleanup" + +frag6_permute_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_permute.py' +} + +frag6_permute_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_queuelimit" "cleanup" + +frag6_queuelimit_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_queuelimit.py' +} + +frag6_queuelimit_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_refrag" "cleanup" + +frag6_refrag_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_refrag.py' +} + +frag6_refrag_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_shortatomic" "cleanup" + +frag6_shortatomic_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_shortatomic.py' +} + +frag6_shortatomic_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_timeout" "cleanup" + +frag6_timeout_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_timeout.py' +} + +frag6_timeout_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_udpatomic" "cleanup" + +frag6_udpatomic_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_udpatomic.py' +} + +frag6_udpatomic_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_udpheader" "cleanup" + +frag6_udpheader_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_udpheader.py' +} + +frag6_udpheader_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_udppayload" "cleanup" + +frag6_udppayload_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_udppayload.py' +} + +frag6_udppayload_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_zerofirst" "cleanup" + +frag6_zerofirst_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_zerofirst.py' +} + +frag6_zerofirst_cleanup() +{ + v6_cleanup +} + +atf_test_case "frag6_zerosecond" "cleanup" + +frag6_zerosecond_body() +{ + v6_init + v6_scapytest 'regress/frag6' 'frag6_zerosecond.py' +} + +frag6_zerosecond_cleanup() +{ + v6_cleanup +} + +atf_init_test_cases() +{ + atf_add_test_case "frag6" + atf_add_test_case "frag6_ext" + atf_add_test_case "frag6_hop" + atf_add_test_case "frag6_maxlen" + atf_add_test_case "frag6_mf0atomic" + atf_add_test_case "frag6_mf0long" + atf_add_test_case "frag6_mf0middle" + atf_add_test_case "frag6_mf0short" + atf_add_test_case "frag6_mf1end" + atf_add_test_case "frag6_opt" + atf_add_test_case "frag6_overatomic" + atf_add_test_case "frag6_overdrop" + atf_add_test_case "frag6_overhead" + atf_add_test_case "frag6_overhead0" + atf_add_test_case "frag6_overhead1" + atf_add_test_case "frag6_overtail" + atf_add_test_case "frag6_overtail0" + atf_add_test_case "frag6_overtail1" + atf_add_test_case "frag6_padding" + atf_add_test_case "frag6_permute" + atf_add_test_case "frag6_queuelimit" + atf_add_test_case "frag6_refrag" + atf_add_test_case "frag6_shortatomic" + atf_add_test_case "frag6_timeout" + atf_add_test_case "frag6_udpatomic" + atf_add_test_case "frag6_udpheader" + atf_add_test_case "frag6_udppayload" + atf_add_test_case "frag6_zerofirst" + atf_add_test_case "frag6_zerosecond" +} Index: tests/sys/netinet6/utils.subr =================================================================== --- /dev/null +++ tests/sys/netinet6/utils.subr @@ -0,0 +1,99 @@ +# $FreeBSD$ +# Utility functions +## + +v6_init() +{ + if [ "`sysctl -i -n kern.features.vimage`" != 1 ]; then + atf_skip "This test requires VIMAGE" + fi +} + +v6_mkepair() +{ + ifname=$(ifconfig epair create) + echo $ifname >> created_interfaces.lst + echo ${ifname%a} +} + +v6_mktarget() +{ + LOCAL="$1/64" + REMOTE="$2/64" + epair=$(v6_mkepair) + v6_mkjail jail1 ${epair}a + ifconfig ${epair}b inet6 ${LOCAL} no_dad up + jexec jail1 ifconfig ${epair}a inet6 ${REMOTE} no_dad up + LOCAL_MAC="$(ifconfig ${epair}b | grep ether | awk '{ print $2}')" + REMOTE_MAC="$(jexec jail1 ifconfig ${epair}a | grep ether | awk '{ print $2}')" + LOCAL_IF="${epair}b" +} + +v6_mkjail() +{ + jailname=$1 + shift + + vnet_interfaces= + for ifname in $@ + do + vnet_interfaces="${vnet_interfaces} vnet.interface=${ifname}" + done + jail -c name=${jailname} persist vnet ${vnet_interfaces} + + echo $jailname >> created_jails.lst +} + +v6_runscapytest() +{ + BASE_FOLDER=$1 + TEST_SCRIPT=$2 + LOCAL_IF=$3 + LOCAL_MAC=$4 + REMOTE_MAC=$5 + LOCAL_ADDR6=$6 + REMOTE_ADDR6=$7 + + + ADDR_FILE=addr.py + + echo "LOCAL_IF = '${LOCAL_IF}'" >> $ADDR_FILE + echo "LOCAL_MAC = '${LOCAL_MAC}'" >> $ADDR_FILE + echo "REMOTE_MAC = '${REMOTE_MAC}'" >> $ADDR_FILE + echo "LOCAL_ADDR6 = '${LOCAL_ADDR6}'" >> $ADDR_FILE + echo "REMOTE_ADDR6 = '${REMOTE_ADDR6}'" >> $ADDR_FILE + + cp $(atf_get_srcdir)/$TEST_SCRIPT . + atf_check -s exit:0 -o ignore python2.7 $TEST_SCRIPT + + } + +v6_scapytest() +{ + BASE_FOLDER=$1 + TEST_SCRIPT=$2 + LOCAL_ADDR6="2001:db8:42::1" + REMOTE_ADDR6="2001:db8:42::2" + v6_mktarget $LOCAL_ADDR6 $REMOTE_ADDR6 + + v6_runscapytest $BASE_FOLDER $TEST_SCRIPT $LOCAL_IF $LOCAL_MAC $REMOTE_MAC $LOCAL_ADDR6 $REMOTE_ADDR6 +} + +v6_cleanup() +{ + if [ -f created_jails.lst ]; then + for jailname in `cat created_jails.lst` + do + jail -r ${jailname} + done + rm created_jails.lst + fi + + if [ -f created_interfaces.lst ]; then + for ifname in `cat created_interfaces.lst` + do + ifconfig ${ifname} destroy + done + rm created_interfaces.lst + fi +}