Page MenuHomeFreeBSD

D17376.1774882733.diff
No OneTemporary

Size
58 KB
Referenced Files
None
Subscribers
None

D17376.1774882733.diff

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 <bsd.test.mk>
Index: tests/sys/netinet6/Makefile.depend
===================================================================
--- /dev/null
+++ tests/sys/netinet6/Makefile.depend
@@ -0,0 +1,11 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.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 <bluhm@openbsd.org>
+#
+# 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
+}

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 30, 2:58 PM (13 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28230426
Default Alt Text
D17376.1774882733.diff (58 KB)

Event Timeline