1# $OpenBSD: Makefile,v 1.13 2016/10/19 14:31:19 tb Exp $ 2 3# The following ports must be installed: 4# 5# python-2.7 interpreted object-oriented programming language 6# py-libdnet python interface to libdnet 7# scapy powerful interactive packet manipulation in python 8 9.if ! (make(clean) || make(cleandir) || make(obj)) 10# Check wether all required python packages are installed. If some 11# are missing print a warning and skip the tests, but do not fail. 12PYTHON_IMPORT != python2.7 -c 'from scapy.all import *' 2>&1 || true 13.endif 14.if ! empty(PYTHON_IMPORT) 15regress: 16 @echo '${PYTHON_IMPORT}' 17 @echo install python and the scapy module for additional tests 18 @echo SKIPPED 19.endif 20 21# This test needs a manual setup of two machines 22# Set up machines: SRC DST 23# SRC is the machine where this makefile is running. 24# DST is running OpenBSD with pf disabled to test the IPv6 stack. 25# Enable echo udp6 in inetd.conf of DST to test UDP fragments. 26# 27# +---+ 1 +---+ 28# |SRC| ----> |DST| 29# +---+ +---+ 30# out in 31 32# Configure Addresses on the machines. 33# Adapt interface and addresse variables to your local setup. 34# 35SRC_IF ?= 36SRC_MAC ?= 37DST_MAC ?= 38 39SRC_OUT6 ?= 40DST_IN6 ?= 41 42.if empty (SRC_IF) || empty (SRC_MAC) || empty (DST_MAC) || \ 43 empty (SRC_OUT6) || empty (DST_IN6) 44regress: 45 @echo this tests needs a remote machine to operate on 46 @echo SRC_IF SRC_MAC DST_MAC SRC_OUT6 DST_IN6 are empty 47 @echo fill out these variables for additional tests 48 @echo SKIPPED 49.endif 50 51depend: addr.py 52 53# Create python include file containing the addresses. 54addr.py: Makefile 55 rm -f $@ $@.tmp 56 echo 'SRC_IF = "${SRC_IF}"' >>$@.tmp 57 echo 'SRC_MAC = "${SRC_MAC}"' >>$@.tmp 58 echo 'DST_MAC = "${DST_MAC}"' >>$@.tmp 59.for var in SRC_OUT DST_IN 60 echo '${var}6 = "${${var}6}"' >>$@.tmp 61.endfor 62 mv $@.tmp $@ 63 64# Set variables so that make runs with and without obj directory. 65# Only do that if necessary to keep visible output short. 66.if ${.CURDIR} == ${.OBJDIR} 67PYTHON = python2.7 ./ 68.else 69PYTHON = PYTHONPATH=${.OBJDIR} python2.7 ${.CURDIR}/ 70.endif 71 72# Ping all addresses. This ensures that the ip addresses are configured 73# and all routing table are set up to allow bidirectional packet flow. 74TARGETS += ping6 75run-regress-ping6: 76 @echo '\n======== $@ ========' 77.for ip in SRC_OUT DST_IN 78 @echo Check ping6 ${ip}6: 79 ping6 -n -c 1 ${${ip}6} 80.endfor 81 82# Ping all addresses again but with 5000 bytes payload. These large 83# packets get fragmented by SRC and must be handled by DST. 84TARGETS += fragping6 85run-regress-fragping6: 86 @echo '\n======== $@ ========' 87.for ip in SRC_OUT DST_IN 88 @echo Check ping6 ${ip}6: 89 ping6 -n -c 1 -s 5000 -m ${${ip}6} 90.endfor 91 92# Send hand-crafted fragmented packet 93TARGETS += frag6 94run-regress-frag6: addr.py 95 @echo '\n======== $@ ========' 96 @echo Check ping6 reassembly 97 ${SUDO} ${PYTHON}frag6.py 98 99# An hop by hop options extension header before the fragment header 100TARGETS += frag6-ext 101run-regress-frag6-ext: addr.py 102 @echo '\n======== $@ ========' 103 @echo Check ping6 extension header reassembly 104 ${SUDO} ${PYTHON}frag6_ext.py 105 106# An destination options extension header after the fragment header 107TARGETS += frag6-opt 108run-regress-frag6-opt: addr.py 109 @echo '\n======== $@ ========' 110 @echo Check ping6 destination option reassembly 111 ${SUDO} ${PYTHON}frag6_opt.py 112 113# The ethernet frame has some padding that must be ignored by reassembly 114TARGETS += frag6-padding 115run-regress-frag6-padding: addr.py 116 @echo '\n======== $@ ========' 117 @echo Check ping6 ethernet padding 118 ${SUDO} ${PYTHON}frag6_padding.py 119 120# fragmented packet with head overlapping first fragment 121TARGETS += frag6-overhead0 122run-regress-frag6-overhead0: addr.py 123 @echo '\n======== $@ ========' 124 @echo Check ping6 head overlapping first fragment 125 ${SUDO} ${PYTHON}frag6_overhead0.py 126 127# fragmented packet with head overlapping second fragment 128TARGETS += frag6-overhead 129run-regress-frag6-overhead: addr.py 130 @echo '\n======== $@ ========' 131 @echo Check ping6 head overlapping second fragment 132 ${SUDO} ${PYTHON}frag6_overhead.py 133 134# fragmented packet with tail overlapping last fragment 135TARGETS += frag6-overtail 136run-regress-frag6-overtail: addr.py 137 @echo '\n======== $@ ========' 138 @echo Check ping6 tail overlapping last fragment 139 ${SUDO} ${PYTHON}frag6_overtail.py 140 141# fragmented packet with overlap, drop future fragments 142TARGETS += frag6-overdrop 143run-regress-frag6-overdrop: addr.py 144 @echo '\n======== $@ ========' 145 @echo Check ping6 overlap drop future fragments 146 ${SUDO} ${PYTHON}frag6_overdrop.py 147 148# fragmented packet with overlap, atomic fragment must be processed 149TARGETS += frag6-overatomic 150run-regress-frag6-overatomic: addr.py 151 @echo '\n======== $@ ========' 152 @echo Check ping6 overlapping and atomic fragments 153 ${SUDO} ${PYTHON}frag6_overatomic.py 154 155# atomic fragment with short fragmented payload 156TARGETS += frag6-shortatomic 157run-regress-frag6-shortatomic: addr.py 158 @echo '\n======== $@ ========' 159 @echo Check ping6 short atomic fragments 160 ${SUDO} ${PYTHON}frag6_shortatomic.py 161 162# fragmented packet permuted fragments 163TARGETS += frag6-permute 164run-regress-frag6-permute: addr.py 165 @echo '\n======== $@ ========' 166 @echo Check ping6 permuted fragments 167 ${SUDO} ${PYTHON}frag6_permute.py 168 169# fragmented packet with zero length first fragment 170TARGETS += frag6-zerofirst 171run-regress-frag6-zerofirst: addr.py 172 @echo '\n======== $@ ========' 173 @echo Check ping6 zero length first fragment 174 ${SUDO} ${PYTHON}frag6_zerofirst.py 175 176# fragmented packet with zero length second fragment 177TARGETS += frag6-zerosecond 178run-regress-frag6-zerosecond: addr.py 179 @echo '\n======== $@ ========' 180 @echo Check ping6 zero length second fragment 181 ${SUDO} ${PYTHON}frag6_zerosecond.py 182 183# fragmented large ping packet that has to be refragmented by reflector 184TARGETS += frag6-refrag 185run-regress-frag6-refrag: addr.py 186 @echo '\n======== $@ ========' 187 @echo Check ping6 with fragmented reply 188 ${SUDO} ${PYTHON}frag6_refrag.py 189 190# atomic fragmented udp packet 191TARGETS += frag6-udpatomic 192run-regress-frag6-udpatomic: addr.py 193 @echo '\n======== $@ ========' 194 @echo Check ping6 atomic udp fragment 195 ${SUDO} ${PYTHON}frag6_udpatomic.py 196 197# fragmented udp packet after header 198TARGETS += frag6-udpheader 199run-regress-frag6-udpheader: addr.py 200 @echo '\n======== $@ ========' 201 @echo Check ping6 udp header fragment 202 ${SUDO} ${PYTHON}frag6_udpheader.py 203 204# fragmented udp packet within payload 205TARGETS += frag6-udppayload 206run-regress-frag6-udppayload: addr.py 207 @echo '\n======== $@ ========' 208 @echo Check ping6 udp payload fragment 209 ${SUDO} ${PYTHON}frag6_udppayload.py 210 211# fragmented icmp packet not within 60 second timeout, test takes 90 seconds 212TARGETS += frag6-timeout 213run-regress-frag6-timeout: addr.py 214 @echo '\n======== $@ ========' 215 @echo Check ping6 fragment timeout 216 ${SUDO} ${PYTHON}frag6_timeout.py 217 218REGRESS_TARGETS = ${TARGETS:S/^/run-regress-/} 219 220CLEANFILES += addr.py *.pyc *.log 221 222.include <bsd.regress.mk> 223