Home | History | Annotate | Line # | Download | only in ipsend
      1  1.5       mrg /*	$NetBSD: iptests.c,v 1.5 2018/02/04 08:19:42 mrg Exp $	*/
      2  1.1  christos 
      3  1.1  christos /*
      4  1.3   darrenr  * Copyright (C) 2012 by Darren Reed.
      5  1.1  christos  *
      6  1.1  christos  * See the IPFILTER.LICENCE file for details on licencing.
      7  1.1  christos  *
      8  1.1  christos  */
      9  1.1  christos #if !defined(lint)
     10  1.5       mrg static __attribute__((__used__)) const char sccsid[] = "%W% %G% (C)1995 Darren Reed";
     11  1.5       mrg static __attribute__((__used__)) const char rcsid[] = "@(#)Id: iptests.c,v 1.1.1.2 2012/07/22 13:44:37 darrenr";
     12  1.1  christos #endif
     13  1.1  christos #include <sys/param.h>
     14  1.1  christos #include <sys/types.h>
     15  1.2  christos #include <stdbool.h>
     16  1.1  christos #if defined(__NetBSD__) && defined(__vax__)
     17  1.1  christos /*
     18  1.1  christos  * XXX need to declare boolean_t for _KERNEL <sys/files.h>
     19  1.1  christos  * which ends up including <sys/device.h> for vax.  See PR#32907
     20  1.1  christos  * for further details.
     21  1.1  christos  */
     22  1.1  christos typedef	int	boolean_t;
     23  1.1  christos #endif
     24  1.1  christos #include <sys/time.h>
     25  1.1  christos #if !defined(__osf__)
     26  1.1  christos # ifdef __NetBSD__
     27  1.1  christos #  include <machine/lock.h>
     28  1.2  christos #  include <sys/mutex.h>
     29  1.1  christos # endif
     30  1.1  christos # define _KERNEL
     31  1.1  christos # define KERNEL
     32  1.1  christos # if !defined(solaris) && !defined(linux) && !defined(__sgi) && !defined(hpux)
     33  1.1  christos #  include <sys/file.h>
     34  1.1  christos # else
     35  1.1  christos #  ifdef solaris
     36  1.1  christos #   include <sys/dditypes.h>
     37  1.1  christos #  endif
     38  1.1  christos # endif
     39  1.1  christos # undef  _KERNEL
     40  1.1  christos # undef  KERNEL
     41  1.1  christos #endif
     42  1.1  christos #if !defined(solaris) && !defined(linux) && !defined(__sgi)
     43  1.1  christos # include <nlist.h>
     44  1.4     kamil #if defined(__FreeBSD__)
     45  1.1  christos # include <sys/user.h>
     46  1.4     kamil #endif
     47  1.1  christos # include <sys/proc.h>
     48  1.1  christos #endif
     49  1.1  christos #if !defined(ultrix) && !defined(hpux) && !defined(linux) && \
     50  1.1  christos     !defined(__sgi) && !defined(__osf__) && !defined(_AIX51)
     51  1.1  christos # include <kvm.h>
     52  1.1  christos #endif
     53  1.1  christos #ifndef	ultrix
     54  1.1  christos # include <sys/socket.h>
     55  1.1  christos #endif
     56  1.1  christos #if defined(solaris)
     57  1.1  christos # include <sys/stream.h>
     58  1.1  christos #else
     59  1.1  christos # include <sys/socketvar.h>
     60  1.1  christos #endif
     61  1.1  christos #ifdef sun
     62  1.1  christos #include <sys/systm.h>
     63  1.1  christos #include <sys/session.h>
     64  1.1  christos #endif
     65  1.1  christos #if BSD >= 199103
     66  1.1  christos # include <sys/sysctl.h>
     67  1.1  christos # include <sys/filedesc.h>
     68  1.1  christos # include <paths.h>
     69  1.1  christos #endif
     70  1.1  christos #include <netinet/in_systm.h>
     71  1.1  christos #include <sys/socket.h>
     72  1.1  christos #ifdef __hpux
     73  1.1  christos # define _NET_ROUTE_INCLUDED
     74  1.1  christos #endif
     75  1.1  christos #include <net/if.h>
     76  1.1  christos #if defined(linux) && (LINUX >= 0200)
     77  1.1  christos # include <asm/atomic.h>
     78  1.1  christos #endif
     79  1.1  christos #if !defined(linux)
     80  1.1  christos # if defined(__FreeBSD__)
     81  1.1  christos #  include "radix_ipf.h"
     82  1.1  christos # endif
     83  1.1  christos # if !defined(solaris)
     84  1.1  christos #  include <net/route.h>
     85  1.1  christos # endif
     86  1.1  christos #else
     87  1.1  christos # define __KERNEL__	/* because there's a macro not wrapped by this */
     88  1.1  christos # include <net/route.h>	/* in this file :-/ */
     89  1.1  christos #endif
     90  1.1  christos #include <netinet/in.h>
     91  1.1  christos #include <arpa/inet.h>
     92  1.1  christos #include <netinet/ip.h>
     93  1.1  christos #if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
     94  1.1  christos # include <sys/sysmacros.h>
     95  1.1  christos #endif
     96  1.1  christos #include <stdio.h>
     97  1.1  christos #include <unistd.h>
     98  1.1  christos #include <stdlib.h>
     99  1.1  christos #include <string.h>
    100  1.1  christos #ifdef __hpux
    101  1.1  christos # undef _NET_ROUTE_INCLUDED
    102  1.1  christos #endif
    103  1.1  christos #if !defined(linux)
    104  1.1  christos # include <netinet/ip_var.h>
    105  1.1  christos # if !defined(__hpux) && !defined(solaris)
    106  1.1  christos #  include <netinet/in_pcb.h>
    107  1.1  christos # endif
    108  1.1  christos #endif
    109  1.1  christos #include "ipsend.h"
    110  1.1  christos #if !defined(linux) && !defined(__hpux)
    111  1.1  christos # include <netinet/tcp_timer.h>
    112  1.1  christos # include <netinet/tcp_var.h>
    113  1.1  christos #endif
    114  1.1  christos #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000000)
    115  1.1  christos # define USE_NANOSLEEP
    116  1.1  christos #endif
    117  1.1  christos 
    118  1.1  christos 
    119  1.1  christos #ifdef USE_NANOSLEEP
    120  1.1  christos # define	PAUSE() ts.tv_sec = 0; ts.tv_nsec = 10000000; \
    121  1.1  christos 		  (void) nanosleep(&ts, NULL)
    122  1.1  christos #else
    123  1.1  christos # define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
    124  1.1  christos 		  (void) select(0, NULL, NULL, NULL, &tv)
    125  1.1  christos #endif
    126  1.1  christos 
    127  1.1  christos 
    128  1.1  christos void	ip_test1(dev, mtu, ip, gwip, ptest)
    129  1.1  christos 	char	*dev;
    130  1.1  christos 	int	mtu;
    131  1.1  christos 	ip_t	*ip;
    132  1.1  christos 	struct	in_addr	gwip;
    133  1.1  christos 	int	ptest;
    134  1.1  christos {
    135  1.1  christos #ifdef USE_NANOSLEEP
    136  1.1  christos 	struct	timespec ts;
    137  1.1  christos #else
    138  1.1  christos 	struct	timeval	tv;
    139  1.1  christos #endif
    140  1.1  christos 	udphdr_t *u;
    141  1.1  christos 	int	nfd, i = 0, len, id = getpid();
    142  1.1  christos 
    143  1.1  christos 	IP_HL_A(ip, sizeof(*ip) >> 2);
    144  1.1  christos 	IP_V_A(ip, IPVERSION);
    145  1.1  christos 	ip->ip_tos = 0;
    146  1.1  christos 	ip->ip_off = 0;
    147  1.1  christos 	ip->ip_ttl = 60;
    148  1.1  christos 	ip->ip_p = IPPROTO_UDP;
    149  1.1  christos 	ip->ip_sum = 0;
    150  1.1  christos 	u = (udphdr_t *)(ip + 1);
    151  1.1  christos 	u->uh_sport = htons(1);
    152  1.1  christos 	u->uh_dport = htons(9);
    153  1.1  christos 	u->uh_sum = 0;
    154  1.1  christos 	u->uh_ulen = htons(sizeof(*u) + 4);
    155  1.1  christos 	ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen);
    156  1.1  christos 	len = ip->ip_len;
    157  1.1  christos 
    158  1.1  christos 	nfd = initdevice(dev, 1);
    159  1.1  christos 	if (nfd == -1)
    160  1.1  christos 		return;
    161  1.1  christos 
    162  1.1  christos 	if (!ptest || (ptest == 1)) {
    163  1.1  christos 		/*
    164  1.1  christos 		 * Part1: hl < len
    165  1.1  christos 		 */
    166  1.1  christos 		ip->ip_id = 0;
    167  1.1  christos 		printf("1.1. sending packets with ip_hl < ip_len\n");
    168  1.1  christos 		for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) {
    169  1.1  christos 			IP_HL_A(ip, i >> 2);
    170  1.1  christos 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    171  1.1  christos 			printf("%d\r", i);
    172  1.1  christos 			fflush(stdout);
    173  1.1  christos 			PAUSE();
    174  1.1  christos 		}
    175  1.1  christos 		putchar('\n');
    176  1.1  christos 	}
    177  1.1  christos 
    178  1.1  christos 	if (!ptest || (ptest == 2)) {
    179  1.1  christos 		/*
    180  1.1  christos 		 * Part2: hl > len
    181  1.1  christos 		 */
    182  1.1  christos 		ip->ip_id = 0;
    183  1.1  christos 		printf("1.2. sending packets with ip_hl > ip_len\n");
    184  1.1  christos 		for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) {
    185  1.1  christos 			IP_HL_A(ip, i >> 2);
    186  1.1  christos 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    187  1.1  christos 			printf("%d\r", i);
    188  1.1  christos 			fflush(stdout);
    189  1.1  christos 			PAUSE();
    190  1.1  christos 		}
    191  1.1  christos 		putchar('\n');
    192  1.1  christos 	}
    193  1.1  christos 
    194  1.1  christos 	if (!ptest || (ptest == 3)) {
    195  1.1  christos 		/*
    196  1.1  christos 		 * Part3: v < 4
    197  1.1  christos 		 */
    198  1.1  christos 		ip->ip_id = 0;
    199  1.1  christos 		printf("1.3. ip_v < 4\n");
    200  1.1  christos 		IP_HL_A(ip, sizeof(*ip) >> 2);
    201  1.1  christos 		for (i = 0; i < 4; i++) {
    202  1.1  christos 			IP_V_A(ip, i);
    203  1.1  christos 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    204  1.1  christos 			printf("%d\r", i);
    205  1.1  christos 			fflush(stdout);
    206  1.1  christos 			PAUSE();
    207  1.1  christos 		}
    208  1.1  christos 		putchar('\n');
    209  1.1  christos 	}
    210  1.1  christos 
    211  1.1  christos 	if (!ptest || (ptest == 4)) {
    212  1.1  christos 		/*
    213  1.1  christos 		 * Part4: v > 4
    214  1.1  christos 		 */
    215  1.1  christos 		ip->ip_id = 0;
    216  1.1  christos 		printf("1.4. ip_v > 4\n");
    217  1.1  christos 		for (i = 5; i < 16; i++) {
    218  1.1  christos 			IP_V_A(ip, i);
    219  1.1  christos 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    220  1.1  christos 			printf("%d\r", i);
    221  1.1  christos 			fflush(stdout);
    222  1.1  christos 			PAUSE();
    223  1.1  christos 		}
    224  1.1  christos 		putchar('\n');
    225  1.1  christos 	}
    226  1.1  christos 
    227  1.1  christos 	if (!ptest || (ptest == 5)) {
    228  1.1  christos 		/*
    229  1.1  christos 		 * Part5: len < packet
    230  1.1  christos 		 */
    231  1.1  christos 		ip->ip_id = 0;
    232  1.1  christos 		IP_V_A(ip, IPVERSION);
    233  1.1  christos 		i = ip->ip_len + 1;
    234  1.1  christos 		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
    235  1.1  christos 		for (; i < (ip->ip_len * 2); i++) {
    236  1.1  christos 			ip->ip_id = htons(id++);
    237  1.1  christos 			ip->ip_sum = 0;
    238  1.1  christos 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    239  1.1  christos 			(void) send_ether(nfd, (char *)ip, i, gwip);
    240  1.1  christos 			printf("%d\r", i);
    241  1.1  christos 			fflush(stdout);
    242  1.1  christos 			PAUSE();
    243  1.1  christos 		}
    244  1.1  christos 		putchar('\n');
    245  1.1  christos 		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
    246  1.1  christos 		for (i = len; i > 0; i--) {
    247  1.1  christos 			ip->ip_id = htons(id++);
    248  1.1  christos 			ip->ip_len = i;
    249  1.1  christos 			ip->ip_sum = 0;
    250  1.1  christos 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    251  1.1  christos 			(void) send_ether(nfd, (char *)ip, len, gwip);
    252  1.1  christos 			printf("%d\r", i);
    253  1.1  christos 			fflush(stdout);
    254  1.1  christos 			PAUSE();
    255  1.1  christos 		}
    256  1.1  christos 		putchar('\n');
    257  1.1  christos 	}
    258  1.1  christos 
    259  1.1  christos 	if (!ptest || (ptest == 6)) {
    260  1.1  christos 		/*
    261  1.1  christos 		 * Part6: len > packet
    262  1.1  christos 		 */
    263  1.1  christos 		ip->ip_id = 0;
    264  1.1  christos 		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
    265  1.1  christos 		for (i = len + 1; i < (len * 2); i++) {
    266  1.1  christos 			ip->ip_id = htons(id++);
    267  1.1  christos 			ip->ip_len = i;
    268  1.1  christos 			ip->ip_sum = 0;
    269  1.1  christos 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    270  1.1  christos 			(void) send_ether(nfd, (char *)ip, len, gwip);
    271  1.1  christos 			printf("%d\r", i);
    272  1.1  christos 			fflush(stdout);
    273  1.1  christos 			PAUSE();
    274  1.1  christos 		}
    275  1.1  christos 		putchar('\n');
    276  1.1  christos 		ip->ip_len = len;
    277  1.1  christos 		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
    278  1.1  christos 		for (i = len; i > 0; i--) {
    279  1.1  christos 			ip->ip_id = htons(id++);
    280  1.1  christos 			ip->ip_sum = 0;
    281  1.1  christos 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    282  1.1  christos 			(void) send_ether(nfd, (char *)ip, i, gwip);
    283  1.1  christos 			printf("%d\r", i);
    284  1.1  christos 			fflush(stdout);
    285  1.1  christos 			PAUSE();
    286  1.1  christos 		}
    287  1.1  christos 		putchar('\n');
    288  1.1  christos 	}
    289  1.1  christos 
    290  1.1  christos 	if (!ptest || (ptest == 7)) {
    291  1.1  christos 		/*
    292  1.1  christos 		 * Part7: 0 length fragment
    293  1.1  christos 		 */
    294  1.1  christos 		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
    295  1.1  christos 		ip->ip_id = 0;
    296  1.1  christos 		ip->ip_len = sizeof(*ip);
    297  1.1  christos 		ip->ip_off = htons(IP_MF);
    298  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    299  1.1  christos 		fflush(stdout);
    300  1.1  christos 		PAUSE();
    301  1.1  christos 
    302  1.1  christos 		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
    303  1.1  christos 		ip->ip_id = 0;
    304  1.1  christos 		ip->ip_len = sizeof(*ip);
    305  1.1  christos 		ip->ip_off = htons(IP_MF);
    306  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    307  1.1  christos 		fflush(stdout);
    308  1.1  christos 		PAUSE();
    309  1.1  christos 
    310  1.1  christos 		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
    311  1.1  christos 		ip->ip_id = 0;
    312  1.1  christos 		ip->ip_len = sizeof(*ip);
    313  1.1  christos 		ip->ip_off = htons(0xa000);
    314  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    315  1.1  christos 		fflush(stdout);
    316  1.1  christos 		PAUSE();
    317  1.1  christos 
    318  1.1  christos 		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
    319  1.1  christos 		ip->ip_id = 0;
    320  1.1  christos 		ip->ip_len = sizeof(*ip);
    321  1.1  christos 		ip->ip_off = htons(0x0100);
    322  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    323  1.1  christos 		fflush(stdout);
    324  1.1  christos 		PAUSE();
    325  1.1  christos 	}
    326  1.1  christos 
    327  1.1  christos 	if (!ptest || (ptest == 8)) {
    328  1.1  christos 		struct	timeval	tv;
    329  1.1  christos 
    330  1.1  christos 		gettimeofday(&tv, NULL);
    331  1.1  christos 		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
    332  1.1  christos 		/*
    333  1.1  christos 		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
    334  1.1  christos 		 * Mark it as being ICMP (so it doesn't get junked), but
    335  1.1  christos 		 * don't bother about the ICMP header, we're not worrying
    336  1.1  christos 		 * about that here.
    337  1.1  christos 		 */
    338  1.1  christos 		ip->ip_p = IPPROTO_ICMP;
    339  1.1  christos 		ip->ip_off = htons(IP_MF);
    340  1.1  christos 		u->uh_dport = htons(9);
    341  1.1  christos 		ip->ip_id = htons(id++);
    342  1.1  christos 		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
    343  1.1  christos 		ip->ip_len = 768 + 20 + 8;
    344  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    345  1.1  christos 		printf("%d\r", i);
    346  1.1  christos 
    347  1.1  christos 		ip->ip_len = MIN(768 + 20, mtu - 68);
    348  1.1  christos 		i = 512;
    349  1.1  christos 		for (; i < (63 * 1024 + 768); i += 768) {
    350  1.1  christos 			ip->ip_off = htons(IP_MF | (i >> 3));
    351  1.1  christos 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    352  1.1  christos 			printf("%d\r", i);
    353  1.1  christos 			fflush(stdout);
    354  1.1  christos 			PAUSE();
    355  1.1  christos 		}
    356  1.1  christos 		ip->ip_len = 896 + 20;
    357  1.1  christos 		ip->ip_off = htons(i >> 3);
    358  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    359  1.1  christos 		printf("%d\r", i);
    360  1.1  christos 		putchar('\n');
    361  1.1  christos 		fflush(stdout);
    362  1.1  christos 
    363  1.1  christos 		/*
    364  1.1  christos 		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
    365  1.1  christos 		 * Mark it as being ICMP (so it doesn't get junked), but
    366  1.1  christos 		 * don't bother about the ICMP header, we're not worrying
    367  1.1  christos 		 * about that here.  (Lossage here)
    368  1.1  christos 		 */
    369  1.1  christos 		ip->ip_p = IPPROTO_ICMP;
    370  1.1  christos 		ip->ip_off = htons(IP_MF);
    371  1.1  christos 		u->uh_dport = htons(9);
    372  1.1  christos 		ip->ip_id = htons(id++);
    373  1.1  christos 		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
    374  1.1  christos 		ip->ip_len = 768 + 20 + 8;
    375  1.1  christos 		if ((rand() & 0x1f) != 0) {
    376  1.1  christos 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    377  1.1  christos 			printf("%d\r", i);
    378  1.1  christos 		} else
    379  1.1  christos 			printf("skip 0\n");
    380  1.1  christos 
    381  1.1  christos 		ip->ip_len = MIN(768 + 20, mtu - 68);
    382  1.1  christos 		i = 512;
    383  1.1  christos 		for (; i < (63 * 1024 + 768); i += 768) {
    384  1.1  christos 			ip->ip_off = htons(IP_MF | (i >> 3));
    385  1.1  christos 			if ((rand() & 0x1f) != 0) {
    386  1.1  christos 				(void) send_ip(nfd, mtu, ip, gwip, 1);
    387  1.1  christos 				printf("%d\r", i);
    388  1.1  christos 			} else
    389  1.1  christos 				printf("skip %d\n", i);
    390  1.1  christos 			fflush(stdout);
    391  1.1  christos 			PAUSE();
    392  1.1  christos 		}
    393  1.1  christos 		ip->ip_len = 896 + 20;
    394  1.1  christos 		ip->ip_off = htons(i >> 3);
    395  1.1  christos 		if ((rand() & 0x1f) != 0) {
    396  1.1  christos 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    397  1.1  christos 			printf("%d\r", i);
    398  1.1  christos 		} else
    399  1.1  christos 			printf("skip\n");
    400  1.1  christos 		putchar('\n');
    401  1.1  christos 		fflush(stdout);
    402  1.1  christos 
    403  1.1  christos 		/*
    404  1.1  christos 		 * Part8.3: 33k packet - test for not dealing with -ve length
    405  1.1  christos 		 * Mark it as being ICMP (so it doesn't get junked), but
    406  1.1  christos 		 * don't bother about the ICMP header, we're not worrying
    407  1.1  christos 		 * about that here.
    408  1.1  christos 		 */
    409  1.1  christos 		ip->ip_p = IPPROTO_ICMP;
    410  1.1  christos 		ip->ip_off = htons(IP_MF);
    411  1.1  christos 		u->uh_dport = htons(9);
    412  1.1  christos 		ip->ip_id = htons(id++);
    413  1.1  christos 		printf("1.8.3 33k packet\n");
    414  1.1  christos 		ip->ip_len = 768 + 20 + 8;
    415  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    416  1.1  christos 		printf("%d\r", i);
    417  1.1  christos 
    418  1.1  christos 		ip->ip_len = MIN(768 + 20, mtu - 68);
    419  1.1  christos 		i = 512;
    420  1.1  christos 		for (; i < (32 * 1024 + 768); i += 768) {
    421  1.1  christos 			ip->ip_off = htons(IP_MF | (i >> 3));
    422  1.1  christos 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    423  1.1  christos 			printf("%d\r", i);
    424  1.1  christos 			fflush(stdout);
    425  1.1  christos 			PAUSE();
    426  1.1  christos 		}
    427  1.1  christos 		ip->ip_len = 896 + 20;
    428  1.1  christos 		ip->ip_off = htons(i >> 3);
    429  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    430  1.1  christos 		printf("%d\r", i);
    431  1.1  christos 		putchar('\n');
    432  1.1  christos 		fflush(stdout);
    433  1.1  christos 	}
    434  1.1  christos 
    435  1.1  christos 	ip->ip_len = len;
    436  1.1  christos 	ip->ip_off = 0;
    437  1.1  christos 	if (!ptest || (ptest == 9)) {
    438  1.1  christos 		/*
    439  1.1  christos 		 * Part9: off & 0x8000 == 0x8000
    440  1.1  christos 		 */
    441  1.1  christos 		ip->ip_id = 0;
    442  1.1  christos 		ip->ip_off = htons(0x8000);
    443  1.1  christos 		printf("1.9. ip_off & 0x8000 == 0x8000\n");
    444  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    445  1.1  christos 		fflush(stdout);
    446  1.1  christos 		PAUSE();
    447  1.1  christos 	}
    448  1.1  christos 
    449  1.1  christos 	ip->ip_off = 0;
    450  1.1  christos 
    451  1.1  christos 	if (!ptest || (ptest == 10)) {
    452  1.1  christos 		/*
    453  1.1  christos 		 * Part10: ttl = 255
    454  1.1  christos 		 */
    455  1.1  christos 		ip->ip_id = 0;
    456  1.1  christos 		ip->ip_ttl = 255;
    457  1.1  christos 		printf("1.10.0 ip_ttl = 255\n");
    458  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    459  1.1  christos 		fflush(stdout);
    460  1.1  christos 		PAUSE();
    461  1.1  christos 
    462  1.1  christos 		ip->ip_ttl = 128;
    463  1.1  christos 		printf("1.10.1 ip_ttl = 128\n");
    464  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    465  1.1  christos 		fflush(stdout);
    466  1.1  christos 		PAUSE();
    467  1.1  christos 
    468  1.1  christos 		ip->ip_ttl = 0;
    469  1.1  christos 		printf("1.10.2 ip_ttl = 0\n");
    470  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    471  1.1  christos 		fflush(stdout);
    472  1.1  christos 		PAUSE();
    473  1.1  christos 	}
    474  1.1  christos 
    475  1.1  christos 	(void) close(nfd);
    476  1.1  christos }
    477  1.1  christos 
    478  1.1  christos 
    479  1.1  christos void	ip_test2(dev, mtu, ip, gwip, ptest)
    480  1.1  christos 	char	*dev;
    481  1.1  christos 	int	mtu;
    482  1.1  christos 	ip_t	*ip;
    483  1.1  christos 	struct	in_addr	gwip;
    484  1.1  christos 	int	ptest;
    485  1.1  christos {
    486  1.1  christos #ifdef USE_NANOSLEEP
    487  1.1  christos 	struct	timespec ts;
    488  1.1  christos #else
    489  1.1  christos 	struct	timeval	tv;
    490  1.1  christos #endif
    491  1.1  christos 	int	nfd;
    492  1.1  christos 	u_char	*s;
    493  1.1  christos 
    494  1.1  christos 
    495  1.1  christos 	nfd = initdevice(dev, 1);
    496  1.1  christos 	if (nfd == -1)
    497  1.1  christos 		return;
    498  1.1  christos 
    499  1.1  christos 	IP_HL_A(ip, 6);
    500  1.1  christos 	ip->ip_len = IP_HL(ip) << 2;
    501  1.1  christos 	s = (u_char *)(ip + 1);
    502  1.1  christos 	s[IPOPT_OPTVAL] = IPOPT_NOP;
    503  1.1  christos 	s++;
    504  1.1  christos 	if (!ptest || (ptest == 1)) {
    505  1.1  christos 		/*
    506  1.1  christos 		 * Test 1: option length > packet length,
    507  1.1  christos 		 *                header length == packet length
    508  1.1  christos 		 */
    509  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_TS;
    510  1.1  christos 		s[IPOPT_OLEN] = 4;
    511  1.1  christos 		s[IPOPT_OFFSET] = IPOPT_MINOFF;
    512  1.1  christos 		ip->ip_p = IPPROTO_IP;
    513  1.1  christos 		printf("2.1 option length > packet length\n");
    514  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    515  1.1  christos 		fflush(stdout);
    516  1.1  christos 		PAUSE();
    517  1.1  christos 	}
    518  1.1  christos 
    519  1.1  christos 	IP_HL_A(ip, 7);
    520  1.1  christos 	ip->ip_len = IP_HL(ip) << 2;
    521  1.1  christos 	if (!ptest || (ptest == 1)) {
    522  1.1  christos 		/*
    523  1.1  christos 		 * Test 2: options have length = 0
    524  1.1  christos 		 */
    525  1.1  christos 		printf("2.2.1 option length = 0, RR\n");
    526  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_RR;
    527  1.1  christos 		s[IPOPT_OLEN] = 0;
    528  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    529  1.1  christos 		fflush(stdout);
    530  1.1  christos 		PAUSE();
    531  1.1  christos 
    532  1.1  christos 		printf("2.2.2 option length = 0, TS\n");
    533  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_TS;
    534  1.1  christos 		s[IPOPT_OLEN] = 0;
    535  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    536  1.1  christos 		fflush(stdout);
    537  1.1  christos 		PAUSE();
    538  1.1  christos 
    539  1.1  christos 		printf("2.2.3 option length = 0, SECURITY\n");
    540  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
    541  1.1  christos 		s[IPOPT_OLEN] = 0;
    542  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    543  1.1  christos 		fflush(stdout);
    544  1.1  christos 		PAUSE();
    545  1.1  christos 
    546  1.1  christos 		printf("2.2.4 option length = 0, LSRR\n");
    547  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_LSRR;
    548  1.1  christos 		s[IPOPT_OLEN] = 0;
    549  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    550  1.1  christos 		fflush(stdout);
    551  1.1  christos 		PAUSE();
    552  1.1  christos 
    553  1.1  christos 		printf("2.2.5 option length = 0, SATID\n");
    554  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_SATID;
    555  1.1  christos 		s[IPOPT_OLEN] = 0;
    556  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    557  1.1  christos 		fflush(stdout);
    558  1.1  christos 		PAUSE();
    559  1.1  christos 
    560  1.1  christos 		printf("2.2.6 option length = 0, SSRR\n");
    561  1.1  christos 		s[IPOPT_OPTVAL] = IPOPT_SSRR;
    562  1.1  christos 		s[IPOPT_OLEN] = 0;
    563  1.1  christos 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    564  1.1  christos 		fflush(stdout);
    565  1.1  christos 		PAUSE();
    566  1.1  christos 	}
    567  1.1  christos 
    568  1.1  christos 	(void) close(nfd);
    569  1.1  christos }
    570  1.1  christos 
    571  1.1  christos 
    572  1.1  christos /*
    573  1.1  christos  * test 3 (ICMP)
    574  1.1  christos  */
    575  1.1  christos void	ip_test3(dev, mtu, ip, gwip, ptest)
    576  1.1  christos 	char	*dev;
    577  1.1  christos 	int	mtu;
    578  1.1  christos 	ip_t	*ip;
    579  1.1  christos 	struct	in_addr	gwip;
    580  1.1  christos 	int	ptest;
    581  1.1  christos {
    582  1.1  christos 	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
    583  1.1  christos 	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
    584  1.1  christos #ifdef USE_NANOSLEEP
    585  1.1  christos 	struct	timespec ts;
    586  1.1  christos #else
    587  1.1  christos 	struct	timeval	tv;
    588  1.1  christos #endif
    589  1.1  christos 	struct	icmp	*icp;
    590  1.1  christos 	int	nfd, i;
    591  1.1  christos 
    592  1.1  christos 	IP_HL_A(ip, sizeof(*ip) >> 2);
    593  1.1  christos 	IP_V_A(ip, IPVERSION);
    594  1.1  christos 	ip->ip_tos = 0;
    595  1.1  christos 	ip->ip_off = 0;
    596  1.1  christos 	ip->ip_ttl = 60;
    597  1.1  christos 	ip->ip_p = IPPROTO_ICMP;
    598  1.1  christos 	ip->ip_sum = 0;
    599  1.1  christos 	ip->ip_len = sizeof(*ip) + sizeof(*icp);
    600  1.1  christos 	icp = (struct icmp *)((char *)ip + (IP_HL(ip) << 2));
    601  1.1  christos 
    602  1.1  christos 	nfd = initdevice(dev, 1);
    603  1.1  christos 	if (nfd == -1)
    604  1.1  christos 		return;
    605  1.1  christos 
    606  1.1  christos 	if (!ptest || (ptest == 1)) {
    607  1.1  christos 		/*
    608  1.1  christos 		 * Type 0 - 31, 255, code = 0
    609  1.1  christos 		 */
    610  1.1  christos 		bzero((char *)icp, sizeof(*icp));
    611  1.1  christos 		for (i = 0; i < 32; i++) {
    612  1.1  christos 			icp->icmp_type = i;
    613  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    614  1.1  christos 			PAUSE();
    615  1.1  christos 			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
    616  1.1  christos 		}
    617  1.1  christos 		icp->icmp_type = 255;
    618  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    619  1.1  christos 		PAUSE();
    620  1.1  christos 		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
    621  1.1  christos 		putchar('\n');
    622  1.1  christos 	}
    623  1.1  christos 
    624  1.1  christos 	if (!ptest || (ptest == 2)) {
    625  1.1  christos 		/*
    626  1.1  christos 		 * Type 3, code = 0 - 31
    627  1.1  christos 		 */
    628  1.1  christos 		icp->icmp_type = 3;
    629  1.1  christos 		for (i = 0; i < 32; i++) {
    630  1.1  christos 			icp->icmp_code = i;
    631  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    632  1.1  christos 			PAUSE();
    633  1.1  christos 			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
    634  1.1  christos 		}
    635  1.1  christos 	}
    636  1.1  christos 
    637  1.1  christos 	if (!ptest || (ptest == 3)) {
    638  1.1  christos 		/*
    639  1.1  christos 		 * Type 4, code = 0,127,128,255
    640  1.1  christos 		 */
    641  1.1  christos 		icp->icmp_type = 4;
    642  1.1  christos 		icp->icmp_code = 0;
    643  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    644  1.1  christos 		PAUSE();
    645  1.1  christos 		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
    646  1.1  christos 		icp->icmp_code = 127;
    647  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    648  1.1  christos 		PAUSE();
    649  1.1  christos 		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
    650  1.1  christos 		icp->icmp_code = 128;
    651  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    652  1.1  christos 		PAUSE();
    653  1.1  christos 		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
    654  1.1  christos 		icp->icmp_code = 255;
    655  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    656  1.1  christos 		PAUSE();
    657  1.1  christos 		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
    658  1.1  christos 	}
    659  1.1  christos 
    660  1.1  christos 	if (!ptest || (ptest == 4)) {
    661  1.1  christos 		/*
    662  1.1  christos 		 * Type 5, code = 0,127,128,255
    663  1.1  christos 		 */
    664  1.1  christos 		icp->icmp_type = 5;
    665  1.1  christos 		icp->icmp_code = 0;
    666  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    667  1.1  christos 		PAUSE();
    668  1.1  christos 		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
    669  1.1  christos 		icp->icmp_code = 127;
    670  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    671  1.1  christos 		PAUSE();
    672  1.1  christos 		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
    673  1.1  christos 		icp->icmp_code = 128;
    674  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    675  1.1  christos 		PAUSE();
    676  1.1  christos 		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
    677  1.1  christos 		icp->icmp_code = 255;
    678  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    679  1.1  christos 		PAUSE();
    680  1.1  christos 		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
    681  1.1  christos 	}
    682  1.1  christos 
    683  1.1  christos 	if (!ptest || (ptest == 5)) {
    684  1.1  christos 		/*
    685  1.1  christos 		 * Type 8-10;13-18, code - 0,127,128,255
    686  1.1  christos 		 */
    687  1.1  christos 		for (i = 0; ict1[i]; i++) {
    688  1.1  christos 			icp->icmp_type = ict1[i];
    689  1.1  christos 			icp->icmp_code = 0;
    690  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    691  1.1  christos 			PAUSE();
    692  1.1  christos 			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
    693  1.1  christos 				i * 4);
    694  1.1  christos 			icp->icmp_code = 127;
    695  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    696  1.1  christos 			PAUSE();
    697  1.1  christos 			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
    698  1.1  christos 				i * 4 + 1);
    699  1.1  christos 			icp->icmp_code = 128;
    700  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    701  1.1  christos 			PAUSE();
    702  1.1  christos 			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
    703  1.1  christos 				i * 4 + 2);
    704  1.1  christos 			icp->icmp_code = 255;
    705  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    706  1.1  christos 			PAUSE();
    707  1.1  christos 			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
    708  1.1  christos 				i * 4 + 3);
    709  1.1  christos 		}
    710  1.1  christos 		putchar('\n');
    711  1.1  christos 	}
    712  1.1  christos 
    713  1.1  christos 	if (!ptest || (ptest == 6)) {
    714  1.1  christos 		/*
    715  1.1  christos 		 * Type 12, code - 0,127,128,129,255
    716  1.1  christos 		 */
    717  1.1  christos 		icp->icmp_type = 12;
    718  1.1  christos 		icp->icmp_code = 0;
    719  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    720  1.1  christos 		PAUSE();
    721  1.1  christos 		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
    722  1.1  christos 		icp->icmp_code = 127;
    723  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    724  1.1  christos 		PAUSE();
    725  1.1  christos 		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
    726  1.1  christos 		icp->icmp_code = 128;
    727  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    728  1.1  christos 		PAUSE();
    729  1.1  christos 		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
    730  1.1  christos 		icp->icmp_code = 129;
    731  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    732  1.1  christos 		PAUSE();
    733  1.1  christos 		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
    734  1.1  christos 		icp->icmp_code = 255;
    735  1.1  christos 		(void) send_icmp(nfd, mtu, ip, gwip);
    736  1.1  christos 		PAUSE();
    737  1.1  christos 		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
    738  1.1  christos 		putchar('\n');
    739  1.1  christos 	}
    740  1.1  christos 
    741  1.1  christos 	if (!ptest || (ptest == 7)) {
    742  1.1  christos 		/*
    743  1.1  christos 		 * Type 3;9-10;13-14;17-18 - shorter packets
    744  1.1  christos 		 */
    745  1.1  christos 		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
    746  1.1  christos 		for (i = 0; ict2[i]; i++) {
    747  1.1  christos 			icp->icmp_type = ict1[i];
    748  1.1  christos 			icp->icmp_code = 0;
    749  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    750  1.1  christos 			PAUSE();
    751  1.1  christos 			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
    752  1.1  christos 				i * 4, icp->icmp_type);
    753  1.1  christos 			icp->icmp_code = 127;
    754  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    755  1.1  christos 			PAUSE();
    756  1.1  christos 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
    757  1.1  christos 				i * 4 + 1, icp->icmp_type);
    758  1.1  christos 			icp->icmp_code = 128;
    759  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    760  1.1  christos 			PAUSE();
    761  1.1  christos 			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
    762  1.1  christos 				i * 4 + 2, icp->icmp_type);
    763  1.1  christos 			icp->icmp_code = 255;
    764  1.1  christos 			(void) send_icmp(nfd, mtu, ip, gwip);
    765  1.1  christos 			PAUSE();
    766  1.1  christos 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
    767  1.1  christos 				i * 4 + 3, icp->icmp_type);
    768  1.1  christos 		}
    769  1.1  christos 		putchar('\n');
    770  1.1  christos 	}
    771  1.1  christos }
    772  1.1  christos 
    773  1.1  christos 
    774  1.1  christos /* Perform test 4 (UDP) */
    775  1.1  christos 
    776  1.1  christos void	ip_test4(dev, mtu, ip, gwip, ptest)
    777  1.1  christos 	char	*dev;
    778  1.1  christos 	int	mtu;
    779  1.1  christos 	ip_t	*ip;
    780  1.1  christos 	struct	in_addr	gwip;
    781  1.1  christos 	int	ptest;
    782  1.1  christos {
    783  1.1  christos #ifdef USE_NANOSLEEP
    784  1.1  christos 	struct	timespec ts;
    785  1.1  christos #else
    786  1.1  christos 	struct	timeval	tv;
    787  1.1  christos #endif
    788  1.1  christos 	udphdr_t	*u;
    789  1.1  christos 	int	nfd, i;
    790  1.1  christos 
    791  1.1  christos 
    792  1.1  christos 	IP_HL_A(ip, sizeof(*ip) >> 2);
    793  1.1  christos 	IP_V_A(ip, IPVERSION);
    794  1.1  christos 	ip->ip_tos = 0;
    795  1.1  christos 	ip->ip_off = 0;
    796  1.1  christos 	ip->ip_ttl = 60;
    797  1.1  christos 	ip->ip_p = IPPROTO_UDP;
    798  1.1  christos 	ip->ip_sum = 0;
    799  1.1  christos 	u = (udphdr_t *)((char *)ip + (IP_HL(ip) << 2));
    800  1.1  christos 	u->uh_sport = htons(1);
    801  1.1  christos 	u->uh_dport = htons(1);
    802  1.1  christos 	u->uh_ulen = htons(sizeof(*u) + 4);
    803  1.1  christos 
    804  1.1  christos 	nfd = initdevice(dev, 1);
    805  1.1  christos 	if (nfd == -1)
    806  1.1  christos 		return;
    807  1.1  christos 
    808  1.1  christos 	if (!ptest || (ptest == 1)) {
    809  1.1  christos 		/*
    810  1.1  christos 		 * Test 1. ulen > packet
    811  1.1  christos 		 */
    812  1.1  christos 		u->uh_ulen = htons(sizeof(*u) + 4);
    813  1.1  christos 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    814  1.1  christos 		printf("4.1 UDP uh_ulen > packet size - short packets\n");
    815  1.1  christos 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
    816  1.1  christos 			u->uh_ulen = htons(i);
    817  1.1  christos 			(void) send_udp(nfd, 1500, ip, gwip);
    818  1.1  christos 			printf("%d\r", i);
    819  1.1  christos 			fflush(stdout);
    820  1.1  christos 			PAUSE();
    821  1.1  christos 		}
    822  1.1  christos 		putchar('\n');
    823  1.1  christos 	}
    824  1.1  christos 
    825  1.1  christos 	if (!ptest || (ptest == 2)) {
    826  1.1  christos 		/*
    827  1.1  christos 		 * Test 2. ulen < packet
    828  1.1  christos 		 */
    829  1.1  christos 		u->uh_ulen = htons(sizeof(*u) + 4);
    830  1.1  christos 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    831  1.1  christos 		printf("4.2 UDP uh_ulen < packet size - short packets\n");
    832  1.1  christos 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
    833  1.1  christos 			ip->ip_len = i;
    834  1.1  christos 			(void) send_udp(nfd, 1500, ip, gwip);
    835  1.1  christos 			printf("%d\r", i);
    836  1.1  christos 			fflush(stdout);
    837  1.1  christos 			PAUSE();
    838  1.1  christos 		}
    839  1.1  christos 		putchar('\n');
    840  1.1  christos 	}
    841  1.1  christos 
    842  1.1  christos 	if (!ptest || (ptest == 3)) {
    843  1.1  christos 		/*
    844  1.1  christos 		 * Test 3: sport = 0, sport = 1, sport = 32767
    845  1.1  christos 		 *         sport = 32768, sport = 65535
    846  1.1  christos 		 */
    847  1.1  christos 		u->uh_ulen = sizeof(*u) + 4;
    848  1.1  christos 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    849  1.1  christos 		printf("4.3.1 UDP sport = 0\n");
    850  1.1  christos 		u->uh_sport = 0;
    851  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    852  1.1  christos 		printf("0\n");
    853  1.1  christos 		fflush(stdout);
    854  1.1  christos 		PAUSE();
    855  1.1  christos 		printf("4.3.2 UDP sport = 1\n");
    856  1.1  christos 		u->uh_sport = htons(1);
    857  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    858  1.1  christos 		printf("1\n");
    859  1.1  christos 		fflush(stdout);
    860  1.1  christos 		PAUSE();
    861  1.1  christos 		printf("4.3.3 UDP sport = 32767\n");
    862  1.1  christos 		u->uh_sport = htons(32767);
    863  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    864  1.1  christos 		printf("32767\n");
    865  1.1  christos 		fflush(stdout);
    866  1.1  christos 		PAUSE();
    867  1.1  christos 		printf("4.3.4 UDP sport = 32768\n");
    868  1.1  christos 		u->uh_sport = htons(32768);
    869  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    870  1.1  christos 		printf("32768\n");
    871  1.1  christos 		putchar('\n');
    872  1.1  christos 		fflush(stdout);
    873  1.1  christos 		PAUSE();
    874  1.1  christos 		printf("4.3.5 UDP sport = 65535\n");
    875  1.1  christos 		u->uh_sport = htons(65535);
    876  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    877  1.1  christos 		printf("65535\n");
    878  1.1  christos 		fflush(stdout);
    879  1.1  christos 		PAUSE();
    880  1.1  christos 	}
    881  1.1  christos 
    882  1.1  christos 	if (!ptest || (ptest == 4)) {
    883  1.1  christos 		/*
    884  1.1  christos 		 * Test 4: dport = 0, dport = 1, dport = 32767
    885  1.1  christos 		 *         dport = 32768, dport = 65535
    886  1.1  christos 		 */
    887  1.1  christos 		u->uh_ulen = ntohs(sizeof(*u) + 4);
    888  1.1  christos 		u->uh_sport = htons(1);
    889  1.1  christos 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    890  1.1  christos 		printf("4.4.1 UDP dport = 0\n");
    891  1.1  christos 		u->uh_dport = 0;
    892  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    893  1.1  christos 		printf("0\n");
    894  1.1  christos 		fflush(stdout);
    895  1.1  christos 		PAUSE();
    896  1.1  christos 		printf("4.4.2 UDP dport = 1\n");
    897  1.1  christos 		u->uh_dport = htons(1);
    898  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    899  1.1  christos 		printf("1\n");
    900  1.1  christos 		fflush(stdout);
    901  1.1  christos 		PAUSE();
    902  1.1  christos 		printf("4.4.3 UDP dport = 32767\n");
    903  1.1  christos 		u->uh_dport = htons(32767);
    904  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    905  1.1  christos 		printf("32767\n");
    906  1.1  christos 		fflush(stdout);
    907  1.1  christos 		PAUSE();
    908  1.1  christos 		printf("4.4.4 UDP dport = 32768\n");
    909  1.1  christos 		u->uh_dport = htons(32768);
    910  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    911  1.1  christos 		printf("32768\n");
    912  1.1  christos 		fflush(stdout);
    913  1.1  christos 		PAUSE();
    914  1.1  christos 		printf("4.4.5 UDP dport = 65535\n");
    915  1.1  christos 		u->uh_dport = htons(65535);
    916  1.1  christos 		(void) send_udp(nfd, 1500, ip, gwip);
    917  1.1  christos 		printf("65535\n");
    918  1.1  christos 		fflush(stdout);
    919  1.1  christos 		PAUSE();
    920  1.1  christos 	}
    921  1.1  christos 
    922  1.1  christos 	if (!ptest || (ptest == 5)) {
    923  1.1  christos 		/*
    924  1.1  christos 		 * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) +
    925  1.1  christos 		 * sizeof(ip_t)
    926  1.1  christos 		 */
    927  1.1  christos 		printf("4.5 UDP 20 <= MTU <= 32\n");
    928  1.1  christos 		for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) {
    929  1.1  christos 			(void) send_udp(nfd, i, ip, gwip);
    930  1.1  christos 			printf("%d\r", i);
    931  1.1  christos 			fflush(stdout);
    932  1.1  christos 			PAUSE();
    933  1.1  christos 		}
    934  1.1  christos 		putchar('\n');
    935  1.1  christos 	}
    936  1.1  christos }
    937  1.1  christos 
    938  1.1  christos 
    939  1.1  christos /* Perform test 5 (TCP) */
    940  1.1  christos 
    941  1.1  christos void	ip_test5(dev, mtu, ip, gwip, ptest)
    942  1.1  christos 	char	*dev;
    943  1.1  christos 	int	mtu;
    944  1.1  christos 	ip_t	*ip;
    945  1.1  christos 	struct	in_addr	gwip;
    946  1.1  christos 	int	ptest;
    947  1.1  christos {
    948  1.1  christos #ifdef USE_NANOSLEEP
    949  1.1  christos 	struct	timespec ts;
    950  1.1  christos #else
    951  1.1  christos 	struct	timeval	tv;
    952  1.1  christos #endif
    953  1.1  christos 	tcphdr_t *t;
    954  1.1  christos 	int	nfd, i;
    955  1.1  christos 
    956  1.1  christos 	t = (tcphdr_t *)((char *)ip + (IP_HL(ip) << 2));
    957  1.1  christos #if !defined(linux) && !defined(__osf__)
    958  1.1  christos 	t->th_x2 = 0;
    959  1.1  christos #endif
    960  1.1  christos 	TCP_OFF_A(t, 0);
    961  1.1  christos 	t->th_sport = htons(1);
    962  1.1  christos 	t->th_dport = htons(1);
    963  1.1  christos 	t->th_win = htons(4096);
    964  1.1  christos 	t->th_urp = 0;
    965  1.1  christos 	t->th_sum = 0;
    966  1.1  christos 	t->th_seq = htonl(1);
    967  1.1  christos 	t->th_ack = 0;
    968  1.1  christos 	ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
    969  1.1  christos 
    970  1.1  christos 	nfd = initdevice(dev, 1);
    971  1.1  christos 	if (nfd == -1)
    972  1.1  christos 		return;
    973  1.1  christos 
    974  1.1  christos 	if (!ptest || (ptest == 1)) {
    975  1.1  christos 		/*
    976  1.1  christos 		 * Test 1: flags variations, 0 - 3f
    977  1.1  christos 		 */
    978  1.1  christos 		TCP_OFF_A(t, sizeof(*t) >> 2);
    979  1.1  christos 		printf("5.1 Test TCP flag combinations\n");
    980  1.1  christos 		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
    981  1.1  christos 		     i++) {
    982  1.1  christos 			t->th_flags = i;
    983  1.1  christos 			(void) send_tcp(nfd, mtu, ip, gwip);
    984  1.1  christos 			printf("%d\r", i);
    985  1.1  christos 			fflush(stdout);
    986  1.1  christos 			PAUSE();
    987  1.1  christos 		}
    988  1.1  christos 		putchar('\n');
    989  1.1  christos 	}
    990  1.1  christos 
    991  1.1  christos 	if (!ptest || (ptest == 2)) {
    992  1.1  christos 		t->th_flags = TH_SYN;
    993  1.1  christos 		/*
    994  1.1  christos 		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
    995  1.1  christos 		 *         seq = 0xa000000, seq = 0xffffffff
    996  1.1  christos 		 */
    997  1.1  christos 		printf("5.2.1 TCP seq = 0\n");
    998  1.1  christos 		t->th_seq = htonl(0);
    999  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1000  1.1  christos 		fflush(stdout);
   1001  1.1  christos 		PAUSE();
   1002  1.1  christos 
   1003  1.1  christos 		printf("5.2.2 TCP seq = 1\n");
   1004  1.1  christos 		t->th_seq = htonl(1);
   1005  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1006  1.1  christos 		fflush(stdout);
   1007  1.1  christos 		PAUSE();
   1008  1.1  christos 
   1009  1.1  christos 		printf("5.2.3 TCP seq = 0x7fffffff\n");
   1010  1.1  christos 		t->th_seq = htonl(0x7fffffff);
   1011  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1012  1.1  christos 		fflush(stdout);
   1013  1.1  christos 		PAUSE();
   1014  1.1  christos 
   1015  1.1  christos 		printf("5.2.4 TCP seq = 0x80000000\n");
   1016  1.1  christos 		t->th_seq = htonl(0x80000000);
   1017  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1018  1.1  christos 		fflush(stdout);
   1019  1.1  christos 		PAUSE();
   1020  1.1  christos 
   1021  1.1  christos 		printf("5.2.5 TCP seq = 0xc0000000\n");
   1022  1.1  christos 		t->th_seq = htonl(0xc0000000);
   1023  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1024  1.1  christos 		fflush(stdout);
   1025  1.1  christos 		PAUSE();
   1026  1.1  christos 
   1027  1.1  christos 		printf("5.2.6 TCP seq = 0xffffffff\n");
   1028  1.1  christos 		t->th_seq = htonl(0xffffffff);
   1029  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1030  1.1  christos 		fflush(stdout);
   1031  1.1  christos 		PAUSE();
   1032  1.1  christos 	}
   1033  1.1  christos 
   1034  1.1  christos 	if (!ptest || (ptest == 3)) {
   1035  1.1  christos 		t->th_flags = TH_ACK;
   1036  1.1  christos 		/*
   1037  1.1  christos 		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
   1038  1.1  christos 		 *         ack = 0xa000000, ack = 0xffffffff
   1039  1.1  christos 		 */
   1040  1.1  christos 		printf("5.3.1 TCP ack = 0\n");
   1041  1.1  christos 		t->th_ack = 0;
   1042  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1043  1.1  christos 		fflush(stdout);
   1044  1.1  christos 		PAUSE();
   1045  1.1  christos 
   1046  1.1  christos 		printf("5.3.2 TCP ack = 1\n");
   1047  1.1  christos 		t->th_ack = htonl(1);
   1048  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1049  1.1  christos 		fflush(stdout);
   1050  1.1  christos 		PAUSE();
   1051  1.1  christos 
   1052  1.1  christos 		printf("5.3.3 TCP ack = 0x7fffffff\n");
   1053  1.1  christos 		t->th_ack = htonl(0x7fffffff);
   1054  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1055  1.1  christos 		fflush(stdout);
   1056  1.1  christos 		PAUSE();
   1057  1.1  christos 
   1058  1.1  christos 		printf("5.3.4 TCP ack = 0x80000000\n");
   1059  1.1  christos 		t->th_ack = htonl(0x80000000);
   1060  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1061  1.1  christos 		fflush(stdout);
   1062  1.1  christos 		PAUSE();
   1063  1.1  christos 
   1064  1.1  christos 		printf("5.3.5 TCP ack = 0xc0000000\n");
   1065  1.1  christos 		t->th_ack = htonl(0xc0000000);
   1066  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1067  1.1  christos 		fflush(stdout);
   1068  1.1  christos 		PAUSE();
   1069  1.1  christos 
   1070  1.1  christos 		printf("5.3.6 TCP ack = 0xffffffff\n");
   1071  1.1  christos 		t->th_ack = htonl(0xffffffff);
   1072  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1073  1.1  christos 		fflush(stdout);
   1074  1.1  christos 		PAUSE();
   1075  1.1  christos 	}
   1076  1.1  christos 
   1077  1.1  christos 	if (!ptest || (ptest == 4)) {
   1078  1.1  christos 		t->th_flags = TH_SYN;
   1079  1.1  christos 		/*
   1080  1.1  christos 		 * Test 4: win = 0, win = 32768, win = 65535
   1081  1.1  christos 		 */
   1082  1.1  christos 		printf("5.4.1 TCP win = 0\n");
   1083  1.1  christos 		t->th_seq = htonl(0);
   1084  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1085  1.1  christos 		fflush(stdout);
   1086  1.1  christos 		PAUSE();
   1087  1.1  christos 
   1088  1.1  christos 		printf("5.4.2 TCP win = 32768\n");
   1089  1.1  christos 		t->th_seq = htonl(0x7fff);
   1090  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1091  1.1  christos 		fflush(stdout);
   1092  1.1  christos 		PAUSE();
   1093  1.1  christos 
   1094  1.1  christos 		printf("5.4.3 TCP win = 65535\n");
   1095  1.1  christos 		t->th_win = htons(0xffff);
   1096  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1097  1.1  christos 		fflush(stdout);
   1098  1.1  christos 		PAUSE();
   1099  1.1  christos 	}
   1100  1.1  christos 
   1101  1.1  christos #if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \
   1102  1.1  christos     !defined(__sgi) && !defined(__hpux) && !defined(__osf__)
   1103  1.1  christos 	{
   1104  1.1  christos 	struct tcpcb *tcbp, tcb;
   1105  1.1  christos 	struct tcpiphdr ti;
   1106  1.1  christos 	struct sockaddr_in sin;
   1107  1.1  christos 	int fd;
   1108  1.1  christos 	socklen_t slen;
   1109  1.1  christos 
   1110  1.1  christos 	bzero((char *)&sin, sizeof(sin));
   1111  1.1  christos 
   1112  1.1  christos 	for (i = 1; i < 63; i++) {
   1113  1.1  christos 		fd = socket(AF_INET, SOCK_STREAM, 0);
   1114  1.1  christos 		bzero((char *)&sin, sizeof(sin));
   1115  1.1  christos 		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
   1116  1.1  christos 		sin.sin_port = htons(i);
   1117  1.1  christos 		sin.sin_family = AF_INET;
   1118  1.1  christos 		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
   1119  1.1  christos 			break;
   1120  1.1  christos 		close(fd);
   1121  1.1  christos 	}
   1122  1.1  christos 
   1123  1.1  christos 	if (i == 63) {
   1124  1.1  christos 		printf("Couldn't open a TCP socket between ports 1 and 63\n");
   1125  1.1  christos 		printf("to host %s for test 5 and 6 - skipping.\n",
   1126  1.1  christos 			inet_ntoa(ip->ip_dst));
   1127  1.1  christos 		goto skip_five_and_six;
   1128  1.1  christos 	}
   1129  1.1  christos 
   1130  1.1  christos 	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
   1131  1.1  christos 	t->th_dport = htons(i);
   1132  1.1  christos 	slen = sizeof(sin);
   1133  1.1  christos 	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
   1134  1.1  christos 		t->th_sport = sin.sin_port;
   1135  1.1  christos 	if (!(tcbp = find_tcp(fd, &ti))) {
   1136  1.1  christos 		printf("Can't find PCB\n");
   1137  1.1  christos 		goto skip_five_and_six;
   1138  1.1  christos 	}
   1139  1.1  christos 	KMCPY(&tcb, tcbp, sizeof(tcb));
   1140  1.1  christos 	ti.ti_win = tcb.rcv_adv;
   1141  1.1  christos 	ti.ti_seq = htonl(tcb.snd_nxt - 1);
   1142  1.1  christos 	ti.ti_ack = tcb.rcv_nxt;
   1143  1.1  christos 
   1144  1.1  christos 	if (!ptest || (ptest == 5)) {
   1145  1.1  christos 		/*
   1146  1.1  christos 		 * Test 5: urp
   1147  1.1  christos 		 */
   1148  1.1  christos 		t->th_flags = TH_ACK|TH_URG;
   1149  1.1  christos 		printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n",
   1150  1.1  christos 			ntohs(t->th_sport), ntohs(t->th_dport));
   1151  1.1  christos 		t->th_urp = htons(1);
   1152  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1153  1.1  christos 		PAUSE();
   1154  1.1  christos 
   1155  1.1  christos 		t->th_seq = htonl(tcb.snd_nxt);
   1156  1.1  christos 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1;
   1157  1.1  christos 		t->th_urp = htons(0x7fff);
   1158  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1159  1.1  christos 		PAUSE();
   1160  1.1  christos 		t->th_urp = htons(0x8000);
   1161  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1162  1.1  christos 		PAUSE();
   1163  1.1  christos 		t->th_urp = htons(0xffff);
   1164  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1165  1.1  christos 		PAUSE();
   1166  1.1  christos 		t->th_urp = 0;
   1167  1.1  christos 		t->th_flags &= ~TH_URG;
   1168  1.1  christos 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
   1169  1.1  christos 	}
   1170  1.1  christos 
   1171  1.1  christos 	if (!ptest || (ptest == 6)) {
   1172  1.1  christos 		/*
   1173  1.1  christos 		 * Test 6: data offset, off = 0, off is inside, off is outside
   1174  1.1  christos 		 */
   1175  1.1  christos 		t->th_flags = TH_ACK;
   1176  1.1  christos 		printf("5.6.1 TCP off = 1-15, len = 40\n");
   1177  1.1  christos 		for (i = 1; i < 16; i++) {
   1178  1.1  christos 			TCP_OFF_A(t, ntohs(i));
   1179  1.1  christos 			(void) send_tcp(nfd, mtu, ip, gwip);
   1180  1.1  christos 			printf("%d\r", i);
   1181  1.1  christos 			fflush(stdout);
   1182  1.1  christos 			PAUSE();
   1183  1.1  christos 		}
   1184  1.1  christos 		putchar('\n');
   1185  1.1  christos 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
   1186  1.1  christos 	}
   1187  1.1  christos 
   1188  1.1  christos 	(void) close(fd);
   1189  1.1  christos 	}
   1190  1.1  christos skip_five_and_six:
   1191  1.1  christos #endif
   1192  1.1  christos 	t->th_seq = htonl(1);
   1193  1.1  christos 	t->th_ack = htonl(1);
   1194  1.1  christos 	TCP_OFF_A(t, 0);
   1195  1.1  christos 
   1196  1.1  christos 	if (!ptest || (ptest == 7)) {
   1197  1.1  christos 		t->th_flags = TH_SYN;
   1198  1.1  christos 		/*
   1199  1.1  christos 		 * Test 7: sport = 0, sport = 1, sport = 32767
   1200  1.1  christos 		 *         sport = 32768, sport = 65535
   1201  1.1  christos 		 */
   1202  1.1  christos 		printf("5.7.1 TCP sport = 0\n");
   1203  1.1  christos 		t->th_sport = 0;
   1204  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1205  1.1  christos 		fflush(stdout);
   1206  1.1  christos 		PAUSE();
   1207  1.1  christos 
   1208  1.1  christos 		printf("5.7.2 TCP sport = 1\n");
   1209  1.1  christos 		t->th_sport = htons(1);
   1210  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1211  1.1  christos 		fflush(stdout);
   1212  1.1  christos 		PAUSE();
   1213  1.1  christos 
   1214  1.1  christos 		printf("5.7.3 TCP sport = 32767\n");
   1215  1.1  christos 		t->th_sport = htons(32767);
   1216  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1217  1.1  christos 		fflush(stdout);
   1218  1.1  christos 		PAUSE();
   1219  1.1  christos 
   1220  1.1  christos 		printf("5.7.4 TCP sport = 32768\n");
   1221  1.1  christos 		t->th_sport = htons(32768);
   1222  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1223  1.1  christos 		fflush(stdout);
   1224  1.1  christos 		PAUSE();
   1225  1.1  christos 
   1226  1.1  christos 		printf("5.7.5 TCP sport = 65535\n");
   1227  1.1  christos 		t->th_sport = htons(65535);
   1228  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1229  1.1  christos 		fflush(stdout);
   1230  1.1  christos 		PAUSE();
   1231  1.1  christos 	}
   1232  1.1  christos 
   1233  1.1  christos 	if (!ptest || (ptest == 8)) {
   1234  1.1  christos 		t->th_sport = htons(1);
   1235  1.1  christos 		t->th_flags = TH_SYN;
   1236  1.1  christos 		/*
   1237  1.1  christos 		 * Test 8: dport = 0, dport = 1, dport = 32767
   1238  1.1  christos 		 *         dport = 32768, dport = 65535
   1239  1.1  christos 		 */
   1240  1.1  christos 		printf("5.8.1 TCP dport = 0\n");
   1241  1.1  christos 		t->th_dport = 0;
   1242  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1243  1.1  christos 		fflush(stdout);
   1244  1.1  christos 		PAUSE();
   1245  1.1  christos 
   1246  1.1  christos 		printf("5.8.2 TCP dport = 1\n");
   1247  1.1  christos 		t->th_dport = htons(1);
   1248  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1249  1.1  christos 		fflush(stdout);
   1250  1.1  christos 		PAUSE();
   1251  1.1  christos 
   1252  1.1  christos 		printf("5.8.3 TCP dport = 32767\n");
   1253  1.1  christos 		t->th_dport = htons(32767);
   1254  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1255  1.1  christos 		fflush(stdout);
   1256  1.1  christos 		PAUSE();
   1257  1.1  christos 
   1258  1.1  christos 		printf("5.8.4 TCP dport = 32768\n");
   1259  1.1  christos 		t->th_dport = htons(32768);
   1260  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1261  1.1  christos 		fflush(stdout);
   1262  1.1  christos 		PAUSE();
   1263  1.1  christos 
   1264  1.1  christos 		printf("5.8.5 TCP dport = 65535\n");
   1265  1.1  christos 		t->th_dport = htons(65535);
   1266  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1267  1.1  christos 		fflush(stdout);
   1268  1.1  christos 		PAUSE();
   1269  1.1  christos 	}
   1270  1.1  christos 
   1271  1.1  christos 	/* LAND attack - self connect, so make src & dst ip/port the same */
   1272  1.1  christos 	if (!ptest || (ptest == 9)) {
   1273  1.1  christos 		printf("5.9 TCP LAND attack. sport = 25, dport = 25\n");
   1274  1.1  christos 		/* chose SMTP port 25 */
   1275  1.1  christos 		t->th_sport = htons(25);
   1276  1.1  christos 		t->th_dport = htons(25);
   1277  1.1  christos 		t->th_flags = TH_SYN;
   1278  1.1  christos 		ip->ip_src = ip->ip_dst;
   1279  1.1  christos 		(void) send_tcp(nfd, mtu, ip, gwip);
   1280  1.1  christos 		fflush(stdout);
   1281  1.1  christos 		PAUSE();
   1282  1.1  christos 	}
   1283  1.1  christos 
   1284  1.1  christos 	/* TCP options header checking */
   1285  1.1  christos 	/* 0 length options, etc */
   1286  1.1  christos }
   1287  1.1  christos 
   1288  1.1  christos 
   1289  1.1  christos /* Perform test 6 (exhaust mbuf test) */
   1290  1.1  christos 
   1291  1.1  christos void	ip_test6(dev, mtu, ip, gwip, ptest)
   1292  1.1  christos 	char	*dev;
   1293  1.1  christos 	int	mtu;
   1294  1.1  christos 	ip_t	*ip;
   1295  1.1  christos 	struct	in_addr	gwip;
   1296  1.1  christos 	int	ptest;
   1297  1.1  christos {
   1298  1.1  christos #ifdef USE_NANOSLEEP
   1299  1.1  christos 	struct	timespec ts;
   1300  1.1  christos #else
   1301  1.1  christos 	struct	timeval	tv;
   1302  1.1  christos #endif
   1303  1.1  christos 	udphdr_t *u;
   1304  1.1  christos 	int	nfd, i, j, k;
   1305  1.1  christos 
   1306  1.1  christos 	IP_V_A(ip, IPVERSION);
   1307  1.1  christos 	ip->ip_tos = 0;
   1308  1.1  christos 	ip->ip_off = 0;
   1309  1.1  christos 	ip->ip_ttl = 60;
   1310  1.1  christos 	ip->ip_p = IPPROTO_UDP;
   1311  1.1  christos 	ip->ip_sum = 0;
   1312  1.1  christos 	u = (udphdr_t *)(ip + 1);
   1313  1.1  christos 	u->uh_sport = htons(1);
   1314  1.1  christos 	u->uh_dport = htons(9);
   1315  1.1  christos 	u->uh_sum = 0;
   1316  1.1  christos 
   1317  1.1  christos 	nfd = initdevice(dev, 1);
   1318  1.1  christos 	if (nfd == -1)
   1319  1.1  christos 		return;
   1320  1.1  christos 
   1321  1.1  christos 	u->uh_ulen = htons(7168);
   1322  1.1  christos 
   1323  1.1  christos 	printf("6. Exhaustive mbuf test.\n");
   1324  1.1  christos 	printf("   Send 7k packet in 768 & 128 byte fragments, 128 times.\n");
   1325  1.1  christos 	printf("   Total of around 8,900 packets\n");
   1326  1.1  christos 	for (i = 0; i < 128; i++) {
   1327  1.1  christos 		/*
   1328  1.1  christos 		 * First send the entire packet in 768 byte chunks.
   1329  1.1  christos 		 */
   1330  1.1  christos 		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
   1331  1.1  christos 		IP_HL_A(ip, sizeof(*ip) >> 2);
   1332  1.1  christos 		ip->ip_off = htons(IP_MF);
   1333  1.1  christos 		(void) send_ip(nfd, 1500, ip, gwip, 1);
   1334  1.1  christos 		printf("%d %d\r", i, 0);
   1335  1.1  christos 		fflush(stdout);
   1336  1.1  christos 		PAUSE();
   1337  1.1  christos 		/*
   1338  1.1  christos 		 * And again using 128 byte chunks.
   1339  1.1  christos 		 */
   1340  1.1  christos 		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
   1341  1.1  christos 		ip->ip_off = htons(IP_MF);
   1342  1.1  christos 		(void) send_ip(nfd, 1500, ip, gwip, 1);
   1343  1.1  christos 		printf("%d %d\r", i, 0);
   1344  1.1  christos 		fflush(stdout);
   1345  1.1  christos 		PAUSE();
   1346  1.1  christos 
   1347  1.1  christos 		for (j = 768; j < 3584; j += 768) {
   1348  1.1  christos 			ip->ip_len = sizeof(*ip) + 768;
   1349  1.1  christos 			ip->ip_off = htons(IP_MF|(j>>3));
   1350  1.1  christos 			(void) send_ip(nfd, 1500, ip, gwip, 1);
   1351  1.1  christos 			printf("%d %d\r", i, j);
   1352  1.1  christos 			fflush(stdout);
   1353  1.1  christos 			PAUSE();
   1354  1.1  christos 
   1355  1.1  christos 			ip->ip_len = sizeof(*ip) + 128;
   1356  1.1  christos 			for (k = j - 768; k < j; k += 128) {
   1357  1.1  christos 				ip->ip_off = htons(IP_MF|(k>>3));
   1358  1.1  christos 				(void) send_ip(nfd, 1500, ip, gwip, 1);
   1359  1.1  christos 				printf("%d %d\r", i, k);
   1360  1.1  christos 				fflush(stdout);
   1361  1.1  christos 				PAUSE();
   1362  1.1  christos 			}
   1363  1.1  christos 		}
   1364  1.1  christos 	}
   1365  1.1  christos 	putchar('\n');
   1366  1.1  christos }
   1367  1.1  christos 
   1368  1.1  christos 
   1369  1.1  christos /* Perform test 7 (random packets) */
   1370  1.1  christos 
   1371  1.1  christos static	u_long	tbuf[64];
   1372  1.1  christos 
   1373  1.1  christos void	ip_test7(dev, mtu, ip, gwip, ptest)
   1374  1.1  christos 	char	*dev;
   1375  1.1  christos 	int	mtu;
   1376  1.1  christos 	ip_t	*ip;
   1377  1.1  christos 	struct	in_addr	gwip;
   1378  1.1  christos 	int	ptest;
   1379  1.1  christos {
   1380  1.1  christos 	ip_t	*pip;
   1381  1.1  christos #ifdef USE_NANOSLEEP
   1382  1.1  christos 	struct	timespec ts;
   1383  1.1  christos #else
   1384  1.1  christos 	struct	timeval	tv;
   1385  1.1  christos #endif
   1386  1.1  christos 	int	nfd, i, j;
   1387  1.1  christos 	u_char	*s;
   1388  1.1  christos 
   1389  1.1  christos 	nfd = initdevice(dev, 1);
   1390  1.1  christos 	if (nfd == -1)
   1391  1.1  christos 		return;
   1392  1.1  christos 
   1393  1.1  christos 	pip = (ip_t *)tbuf;
   1394  1.1  christos 
   1395  1.1  christos 	srand(time(NULL) ^ (getpid() * getppid()));
   1396  1.1  christos 
   1397  1.1  christos 	printf("7. send 1024 random IP packets.\n");
   1398  1.1  christos 
   1399  1.1  christos 	for (i = 0; i < 512; i++) {
   1400  1.1  christos 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
   1401  1.1  christos 			*s = (rand() >> 13) & 0xff;
   1402  1.1  christos 		IP_V_A(pip, IPVERSION);
   1403  1.1  christos 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
   1404  1.1  christos 		      sizeof(struct in_addr));
   1405  1.1  christos 		pip->ip_sum = 0;
   1406  1.1  christos 		pip->ip_len &= 0xff;
   1407  1.1  christos 		(void) send_ip(nfd, mtu, pip, gwip, 0);
   1408  1.1  christos 		printf("%d\r", i);
   1409  1.1  christos 		fflush(stdout);
   1410  1.1  christos 		PAUSE();
   1411  1.1  christos 	}
   1412  1.1  christos 	putchar('\n');
   1413  1.1  christos 
   1414  1.1  christos 	for (i = 0; i < 512; i++) {
   1415  1.1  christos 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
   1416  1.1  christos 			*s = (rand() >> 13) & 0xff;
   1417  1.1  christos 		IP_V_A(pip, IPVERSION);
   1418  1.1  christos 		pip->ip_off &= htons(0xc000);
   1419  1.1  christos 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
   1420  1.1  christos 		      sizeof(struct in_addr));
   1421  1.1  christos 		pip->ip_sum = 0;
   1422  1.1  christos 		pip->ip_len &= 0xff;
   1423  1.1  christos 		(void) send_ip(nfd, mtu, pip, gwip, 0);
   1424  1.1  christos 		printf("%d\r", i);
   1425  1.1  christos 		fflush(stdout);
   1426  1.1  christos 		PAUSE();
   1427  1.1  christos 	}
   1428  1.1  christos 	putchar('\n');
   1429  1.1  christos }
   1430