Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144477386
D17376.1774882733.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
58 KB
Referenced Files
None
Subscribers
None
D17376.1774882733.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D17376: IPv6 Fragmentation Regression Tests from OpenBSD
Attached
Detach File
Event Timeline
Log In to Comment