xref: /haiku/src/bin/network/traceroute/traceroute.c (revision dd2a1e350b303b855a50fd64e6cb55618be1ae6a)
1 /*
2  * Copyright (c) 1988, 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that: (1) source code distributions
7  * retain the above copyright notice and this paragraph in its entirety, (2)
8  * distributions including binary code include the above copyright notice and
9  * this paragraph in its entirety in the documentation or other materials
10  * provided with the distribution, and (3) all advertising materials mentioning
11  * features or use of this software display the following acknowledgement:
12  * ``This product includes software developed by the University of California,
13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14  * the University nor the names of its contributors may be used to endorse
15  * or promote products derived from this software without specific prior
16  * written permission.
17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20  */
21 
22 /*
23  * traceroute host  - trace the route ip packets follow going to "host".
24  *
25  * Attempt to trace the route an ip packet would follow to some
26  * internet host.  We find out intermediate hops by launching probe
27  * packets with a small ttl (time to live) then listening for an
28  * icmp "time exceeded" reply from a gateway.  We start our probes
29  * with a ttl of one and increase by one until we get an icmp "port
30  * unreachable" (which means we got to "host") or hit a max (which
31  * defaults to net.inet.ip.ttl hops & can be changed with the -m flag).
32  * Three probes (change with -q flag) are sent at each ttl setting and
33  * a line is printed showing the ttl, address of the gateway and
34  * round trip time of each probe.  If the probe answers come from
35  * different gateways, the address of each responding system will
36  * be printed.  If there is no response within a 5 sec. timeout
37  * interval (changed with the -w flag), a "*" is printed for that
38  * probe.
39  *
40  * Probe packets are UDP format.  We don't want the destination
41  * host to process them so the destination port is set to an
42  * unlikely value (if some clod on the destination is using that
43  * value, it can be changed with the -p flag).
44  *
45  * A sample use might be:
46  *
47  *     [yak 71]% traceroute nis.nsf.net.
48  *     traceroute to nis.nsf.net (35.1.1.48), 64 hops max, 40 byte packets
49  *      1  helios.ee.lbl.gov (128.3.112.1)  19 ms  19 ms  0 ms
50  *      2  lilac-dmc.Berkeley.EDU (128.32.216.1)  39 ms  39 ms  19 ms
51  *      3  lilac-dmc.Berkeley.EDU (128.32.216.1)  39 ms  39 ms  19 ms
52  *      4  ccngw-ner-cc.Berkeley.EDU (128.32.136.23)  39 ms  40 ms  39 ms
53  *      5  ccn-nerif22.Berkeley.EDU (128.32.168.22)  39 ms  39 ms  39 ms
54  *      6  128.32.197.4 (128.32.197.4)  40 ms  59 ms  59 ms
55  *      7  131.119.2.5 (131.119.2.5)  59 ms  59 ms  59 ms
56  *      8  129.140.70.13 (129.140.70.13)  99 ms  99 ms  80 ms
57  *      9  129.140.71.6 (129.140.71.6)  139 ms  239 ms  319 ms
58  *     10  129.140.81.7 (129.140.81.7)  220 ms  199 ms  199 ms
59  *     11  nic.merit.edu (35.1.1.48)  239 ms  239 ms  239 ms
60  *
61  * Note that lines 2 & 3 are the same.  This is due to a buggy
62  * kernel on the 2nd hop system -- lbl-csam.arpa -- that forwards
63  * packets with a zero ttl.
64  *
65  * A more interesting example is:
66  *
67  *     [yak 72]% traceroute allspice.lcs.mit.edu.
68  *     traceroute to allspice.lcs.mit.edu (18.26.0.115), 64 hops max, 40 byte packets
69  *      1  helios.ee.lbl.gov (128.3.112.1)  0 ms  0 ms  0 ms
70  *      2  lilac-dmc.Berkeley.EDU (128.32.216.1)  19 ms  19 ms  19 ms
71  *      3  lilac-dmc.Berkeley.EDU (128.32.216.1)  39 ms  19 ms  19 ms
72  *      4  ccngw-ner-cc.Berkeley.EDU (128.32.136.23)  19 ms  39 ms  39 ms
73  *      5  ccn-nerif22.Berkeley.EDU (128.32.168.22)  20 ms  39 ms  39 ms
74  *      6  128.32.197.4 (128.32.197.4)  59 ms  119 ms  39 ms
75  *      7  131.119.2.5 (131.119.2.5)  59 ms  59 ms  39 ms
76  *      8  129.140.70.13 (129.140.70.13)  80 ms  79 ms  99 ms
77  *      9  129.140.71.6 (129.140.71.6)  139 ms  139 ms  159 ms
78  *     10  129.140.81.7 (129.140.81.7)  199 ms  180 ms  300 ms
79  *     11  129.140.72.17 (129.140.72.17)  300 ms  239 ms  239 ms
80  *     12  * * *
81  *     13  128.121.54.72 (128.121.54.72)  259 ms  499 ms  279 ms
82  *     14  * * *
83  *     15  * * *
84  *     16  * * *
85  *     17  * * *
86  *     18  ALLSPICE.LCS.MIT.EDU (18.26.0.115)  339 ms  279 ms  279 ms
87  *
88  * (I start to see why I'm having so much trouble with mail to
89  * MIT.)  Note that the gateways 12, 14, 15, 16 & 17 hops away
90  * either don't send ICMP "time exceeded" messages or send them
91  * with a ttl too small to reach us.  14 - 17 are running the
92  * MIT C Gateway code that doesn't send "time exceeded"s.  God
93  * only knows what's going on with 12.
94  *
95  * The silent gateway 12 in the above may be the result of a bug in
96  * the 4.[23]BSD network code (and its derivatives):  4.x (x <= 3)
97  * sends an unreachable message using whatever ttl remains in the
98  * original datagram.  Since, for gateways, the remaining ttl is
99  * zero, the icmp "time exceeded" is guaranteed to not make it back
100  * to us.  The behavior of this bug is slightly more interesting
101  * when it appears on the destination system:
102  *
103  *      1  helios.ee.lbl.gov (128.3.112.1)  0 ms  0 ms  0 ms
104  *      2  lilac-dmc.Berkeley.EDU (128.32.216.1)  39 ms  19 ms  39 ms
105  *      3  lilac-dmc.Berkeley.EDU (128.32.216.1)  19 ms  39 ms  19 ms
106  *      4  ccngw-ner-cc.Berkeley.EDU (128.32.136.23)  39 ms  40 ms  19 ms
107  *      5  ccn-nerif35.Berkeley.EDU (128.32.168.35)  39 ms  39 ms  39 ms
108  *      6  csgw.Berkeley.EDU (128.32.133.254)  39 ms  59 ms  39 ms
109  *      7  * * *
110  *      8  * * *
111  *      9  * * *
112  *     10  * * *
113  *     11  * * *
114  *     12  * * *
115  *     13  rip.Berkeley.EDU (128.32.131.22)  59 ms !  39 ms !  39 ms !
116  *
117  * Notice that there are 12 "gateways" (13 is the final
118  * destination) and exactly the last half of them are "missing".
119  * What's really happening is that rip (a Sun-3 running Sun OS3.5)
120  * is using the ttl from our arriving datagram as the ttl in its
121  * icmp reply.  So, the reply will time out on the return path
122  * (with no notice sent to anyone since icmp's aren't sent for
123  * icmp's) until we probe with a ttl that's at least twice the path
124  * length.  I.e., rip is really only 7 hops away.  A reply that
125  * returns with a ttl of 1 is a clue this problem exists.
126  * Traceroute prints a "!" after the time if the ttl is <= 1.
127  * Since vendors ship a lot of obsolete (DEC's Ultrix, Sun 3.x) or
128  * non-standard (HPUX) software, expect to see this problem
129  * frequently and/or take care picking the target host of your
130  * probes.
131  *
132  * Other possible annotations after the time are !H, !N, !P (got a host,
133  * network or protocol unreachable, respectively), !S or !F (source
134  * route failed or fragmentation needed -- neither of these should
135  * ever occur and the associated gateway is busted if you see one).  If
136  * almost all the probes result in some kind of unreachable, traceroute
137  * will give up and exit.
138  *
139  * Notes
140  * -----
141  * This program must be run by root or be setuid.  (I suggest that
142  * you *don't* make it setuid -- casual use could result in a lot
143  * of unnecessary traffic on our poor, congested nets.)
144  *
145  * This program requires a kernel mod that does not appear in any
146  * system available from Berkeley:  A raw ip socket using proto
147  * IPPROTO_RAW must interpret the data sent as an ip datagram (as
148  * opposed to data to be wrapped in an ip datagram).  See the README
149  * file that came with the source to this program for a description
150  * of the mods I made to /sys/netinet/raw_ip.c.  Your mileage may
151  * vary.  But, again, ANY 4.x (x < 4) BSD KERNEL WILL HAVE TO BE
152  * MODIFIED TO RUN THIS PROGRAM.
153  *
154  * The udp port usage may appear bizarre (well, ok, it is bizarre).
155  * The problem is that an icmp message only contains 8 bytes of
156  * data from the original datagram.  8 bytes is the size of a udp
157  * header so, if we want to associate replies with the original
158  * datagram, the necessary information must be encoded into the
159  * udp header (the ip id could be used but there's no way to
160  * interlock with the kernel's assignment of ip id's and, anyway,
161  * it would have taken a lot more kernel hacking to allow this
162  * code to set the ip id).  So, to allow two or more users to
163  * use traceroute simultaneously, we use this task's pid as the
164  * source port (the high bit is set to move the port number out
165  * of the "likely" range).  To keep track of which probe is being
166  * replied to (so times and/or hop counts don't get confused by a
167  * reply that was delayed in transit), we increment the destination
168  * port number before each probe.
169  *
170  * Don't use this as a coding example.  I was trying to find a
171  * routing problem and this code sort-of popped out after 48 hours
172  * without sleep.  I was amazed it ever compiled, much less ran.
173  *
174  * I stole the idea for this program from Steve Deering.  Since
175  * the first release, I've learned that had I attended the right
176  * IETF working group meetings, I also could have stolen it from Guy
177  * Almes or Matt Mathis.  I don't know (or care) who came up with
178  * the idea first.  I envy the originators' perspicacity and I'm
179  * glad they didn't keep the idea a secret.
180  *
181  * Tim Seaver, Ken Adelman and C. Philip Wood provided bug fixes and/or
182  * enhancements to the original distribution.
183  *
184  * I've hacked up a round-trip-route version of this that works by
185  * sending a loose-source-routed udp datagram through the destination
186  * back to yourself.  Unfortunately, SO many gateways botch source
187  * routing, the thing is almost worthless.  Maybe one day...
188  *
189  *  -- Van Jacobson (van@ee.lbl.gov)
190  *     Tue Dec 20 03:50:13 PST 1988
191  */
192 
193 #include <sys/param.h>
194 #ifndef __HAIKU__
195 #include <sys/capsicum.h>
196 #endif
197 #include <sys/file.h>
198 #include <sys/ioctl.h>
199 #include <sys/select.h>
200 #include <sys/socket.h>
201 #ifndef __HAIKU__
202 #include <sys/sysctl.h>
203 #endif
204 #include <sys/time.h>
205 
206 #ifndef __HAIKU__
207 #include <netinet/in_systm.h>
208 #endif
209 #include <netinet/in.h>
210 #include <netinet/ip.h>
211 #include <netinet/ip_var.h>
212 #include <netinet/ip_icmp.h>
213 #ifndef __HAIKU__
214 #include <netinet/sctp.h>
215 #include <netinet/sctp_header.h>
216 #endif
217 #include <netinet/udp.h>
218 #include <netinet/tcp.h>
219 #ifndef __HAIKU__
220 #include <netinet/tcpip.h>
221 #endif
222 
223 #include <arpa/inet.h>
224 
225 #ifdef WITH_CASPER
226 #include <libcasper.h>
227 #include <casper/cap_dns.h>
228 #endif
229 
230 #ifdef	IPSEC
231 #include <net/route.h>
232 #include <netipsec/ipsec.h>	/* XXX */
233 #endif	/* IPSEC */
234 
235 #include <ctype.h>
236 #ifndef __HAIKU__
237 #include <capsicum_helpers.h>
238 #endif
239 #include <err.h>
240 #include <errno.h>
241 #include <fcntl.h>
242 #include <malloc.h>
243 #include <memory.h>
244 #include <netdb.h>
245 #include <stdio.h>
246 #include <stdlib.h>
247 #include <stdbool.h>
248 #include <string.h>
249 #include <unistd.h>
250 
251 /* rfc1716 */
252 #ifndef ICMP_UNREACH_FILTER_PROHIB
253 #define ICMP_UNREACH_FILTER_PROHIB	13	/* admin prohibited filter */
254 #endif
255 #ifndef ICMP_UNREACH_HOST_PRECEDENCE
256 #define ICMP_UNREACH_HOST_PRECEDENCE	14	/* host precedence violation */
257 #endif
258 #ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF
259 #define ICMP_UNREACH_PRECEDENCE_CUTOFF	15	/* precedence cutoff */
260 #endif
261 
262 #include "findsaddr.h"
263 #include "ifaddrlist.h"
264 #include "as.h"
265 #include "traceroute.h"
266 
267 /* Maximum number of gateways (include room for one noop) */
268 #define NGATEWAYS ((int)((MAX_IPOPTLEN - IPOPT_MINOFF - 1) / sizeof(u_int32_t)))
269 
270 #ifndef MAXHOSTNAMELEN
271 #define MAXHOSTNAMELEN	64
272 #endif
273 
274 #define Fprintf (void)fprintf
275 #define Printf (void)printf
276 
277 /* What a GRE packet header looks like */
278 struct grehdr {
279 	u_int16_t   flags;
280 	u_int16_t   proto;
281 	u_int16_t   length;	/* PPTP version of these fields */
282 	u_int16_t   callId;
283 };
284 #ifndef IPPROTO_GRE
285 #define IPPROTO_GRE	47
286 #endif
287 
288 /* For GRE, we prepare what looks like a PPTP packet */
289 #define GRE_PPTP_PROTO	0x880b
290 
291 /* Host name and address list */
292 struct hostinfo {
293 	char *name;
294 	int n;
295 	u_int32_t *addrs;
296 };
297 
298 /* Data section of the probe packet */
299 struct outdata {
300 	u_char seq;		/* sequence number of this packet */
301 	u_char ttl;		/* ttl packet left with */
302 	struct timeval tv;	/* time packet left */
303 };
304 
305 u_char	packet[512];		/* last inbound (icmp) packet */
306 
307 struct ip *outip;		/* last output ip packet */
308 u_char *outp;		/* last output inner protocol packet */
309 
310 struct ip *hip = NULL;		/* Quoted IP header */
311 int hiplen = 0;
312 
313 /* loose source route gateway list (including room for final destination) */
314 u_int32_t gwlist[NGATEWAYS + 1];
315 
316 int s;				/* receive (icmp) socket file descriptor */
317 int sndsock;			/* send (udp) socket file descriptor */
318 
319 struct sockaddr whereto;	/* Who to try to reach */
320 struct sockaddr wherefrom;	/* Who we are */
321 int packlen;			/* total length of packet */
322 int protlen;			/* length of protocol part of packet */
323 int minpacket;			/* min ip packet size */
324 int maxpacket = 32 * 1024;	/* max ip packet size */
325 int pmtu;			/* Path MTU Discovery (RFC1191) */
326 u_int pausemsecs;
327 
328 char *prog;
329 char *source;
330 char *hostname;
331 char *device;
332 static const char devnull[] = "/dev/null";
333 
334 int nprobes = -1;
335 int max_ttl;
336 int first_ttl = 1;
337 u_short ident;
338 u_short port;			/* protocol specific base "port" */
339 
340 int options;			/* socket options */
341 int verbose;
342 int waittime = 5;		/* time to wait for response (in seconds) */
343 int nflag;			/* print addresses numerically */
344 int as_path;			/* print as numbers for each hop */
345 char *as_server = NULL;
346 void *asn;
347 #ifdef CANT_HACK_IPCKSUM
348 int doipcksum = 0;		/* don't calculate ip checksums by default */
349 #else
350 int doipcksum = 1;		/* calculate ip checksums by default */
351 #endif
352 int optlen;			/* length of ip options */
353 int fixedPort = 0;		/* Use fixed destination port for TCP and UDP */
354 int printdiff = 0;		/* Print the difference between sent and quoted */
355 int ecnflag = 0;		/* ECN bleaching detection flag */
356 
357 extern int optind;
358 extern int opterr;
359 extern char *optarg;
360 
361 #ifdef WITH_CASPER
362 static cap_channel_t *capdns;
363 #endif
364 
365 /* Forwards */
366 double	deltaT(struct timeval *, struct timeval *);
367 void	freehostinfo(struct hostinfo *);
368 void	getaddr(u_int32_t *, char *);
369 struct	hostinfo *gethostinfo(char *);
370 u_short	in_cksum(u_short *, int);
371 u_int32_t sctp_crc32c(const void *, u_int32_t);
372 char	*inetname(struct in_addr);
373 int	main(int, char **);
374 u_short p_cksum(struct ip *, u_short *, int, int);
375 int	packet_ok(u_char *, int, struct sockaddr_in *, int);
376 char	*pr_type(u_char);
377 void	print(u_char *, int, struct sockaddr_in *);
378 #ifdef	IPSEC
379 int	setpolicy(int so, char *policy);
380 #endif
381 void	send_probe(int, int);
382 struct outproto *setproto(char *);
383 int	str2val(const char *, const char *, int, int);
384 void	tvsub(struct timeval *, struct timeval *);
385 void usage(void);
386 int	wait_for_reply(int, struct sockaddr_in *, const struct timeval *);
387 void pkt_compare(const u_char *, int, const u_char *, int);
388 
389 void	udp_prep(struct outdata *);
390 int	udp_check(const u_char *, int);
391 void	udplite_prep(struct outdata *);
392 int	udplite_check(const u_char *, int);
393 void	tcp_prep(struct outdata *);
394 int	tcp_check(const u_char *, int);
395 void	sctp_prep(struct outdata *);
396 int	sctp_check(const u_char *, int);
397 void	gre_prep(struct outdata *);
398 int	gre_check(const u_char *, int);
399 void	gen_prep(struct outdata *);
400 int	gen_check(const u_char *, int);
401 void	icmp_prep(struct outdata *);
402 int	icmp_check(const u_char *, int);
403 
404 /* Descriptor structure for each outgoing protocol we support */
405 struct outproto {
406 	char	*name;		/* name of protocol */
407 	const char *key;	/* An ascii key for the bytes of the header */
408 	u_char	num;		/* IP protocol number */
409 	u_short	hdrlen;		/* max size of protocol header */
410 	u_short	port;		/* default base protocol-specific "port" */
411 	void	(*prepare)(struct outdata *);
412 				/* finish preparing an outgoing packet */
413 	int	(*check)(const u_char *, int);
414 				/* check an incoming packet */
415 };
416 
417 /* List of supported protocols. The first one is the default. The last
418    one is the handler for generic protocols not explicitly listed. */
419 struct	outproto protos[] = {
420 	{
421 		"udp",
422 		"spt dpt len sum",
423 		IPPROTO_UDP,
424 		sizeof(struct udphdr),
425 		32768 + 666,
426 		udp_prep,
427 		udp_check
428 	},
429 #ifndef __HAIKU__
430 	{
431 		"udplite",
432 		"spt dpt cov sum",
433 		IPPROTO_UDPLITE,
434 		sizeof(struct udphdr),
435 		32768 + 666,
436 		udplite_prep,
437 		udplite_check
438 	},
439 #endif
440 	{
441 		"tcp",
442 		"spt dpt seq     ack     xxflwin sum urp",
443 		IPPROTO_TCP,
444 		sizeof(struct tcphdr),
445 		32768 + 666,
446 		tcp_prep,
447 		tcp_check
448 	},
449 #ifndef __HAIKU__
450 	{
451 		"sctp",
452 		"spt dpt vtag    crc     tyfllen tyfllen ",
453 		IPPROTO_SCTP,
454 		sizeof(struct sctphdr),
455 		32768 + 666,
456 		sctp_prep,
457 		sctp_check
458 	},
459 #endif
460 	{
461 		"gre",
462 		"flg pro len clid",
463 		IPPROTO_GRE,
464 		sizeof(struct grehdr),
465 		GRE_PPTP_PROTO,
466 		gre_prep,
467 		gre_check
468 	},
469 	{
470 		"icmp",
471 		"typ cod sum ",
472 		IPPROTO_ICMP,
473 		sizeof(struct icmp),
474 		0,
475 		icmp_prep,
476 		icmp_check
477 	},
478 	{
479 		NULL,
480 		"",
481 		0,
482 		2 * sizeof(u_short),
483 		0,
484 		gen_prep,
485 		gen_check
486 	},
487 };
488 struct	outproto *proto = &protos[0];
489 
490 const char *ip_hdr_key = "vhtslen id  off tlprsum srcip   dstip   opts";
491 
492 int
493 main(int argc, char **argv)
494 {
495 	register int op, code, n;
496 	register char *cp;
497 	register const char *err;
498 	register u_int32_t *ap;
499 	register struct sockaddr_in *from = (struct sockaddr_in *)&wherefrom;
500 	register struct sockaddr_in *to = (struct sockaddr_in *)&whereto;
501 	register struct hostinfo *hi;
502 	int on = 1;
503 	register struct protoent *pe;
504 	register int ttl, probe, i;
505 	register int seq = 0;
506 	int tos = 0, settos = 0;
507 	register int lsrr = 0;
508 	register u_short off = 0;
509 	struct ifaddrlist *al;
510 	char errbuf[132];
511 	int requestPort = -1;
512 	int sump = 0;
513 	int sockerrno;
514 #ifdef WITH_CASPER
515 	const char *types[] = { "NAME2ADDR", "ADDR2NAME" };
516 	int families[1];
517 	cap_channel_t *casper;
518 #endif
519 #ifndef __HAIKU__
520 	cap_rights_t rights;
521 #endif
522 	bool cansandbox;
523 
524 	/* Insure the socket fds won't be 0, 1 or 2 */
525 	if (open(devnull, O_RDONLY) < 0 ||
526 	    open(devnull, O_RDONLY) < 0 ||
527 	    open(devnull, O_RDONLY) < 0) {
528 		Fprintf(stderr, "%s: open \"%s\": %s\n",
529 		    prog, devnull, strerror(errno));
530 		exit(1);
531 	}
532 	/*
533 	 * Do the setuid-required stuff first, then lose privileges ASAP.
534 	 * Do error checking for these two calls where they appeared in
535 	 * the original code.
536 	 */
537 	cp = "icmp";
538 	pe = getprotobyname(cp);
539 	if (pe) {
540 		if ((s = socket(AF_INET, SOCK_RAW, pe->p_proto)) < 0)
541 			sockerrno = errno;
542 		else if ((sndsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
543 			sockerrno = errno;
544 	}
545 
546 	if (setuid(getuid()) != 0) {
547 		perror("setuid()");
548 		exit(1);
549 	}
550 
551 #ifdef WITH_CASPER
552 	casper = cap_init();
553 	if (casper == NULL)
554 		errx(1, "unable to create casper process");
555 	capdns = cap_service_open(casper, "system.dns");
556 	if (capdns == NULL)
557 		errx(1, "unable to open system.dns service");
558 	if (cap_dns_type_limit(capdns, types, 2) < 0)
559 		errx(1, "unable to limit access to system.dns service");
560 	families[0] = AF_INET;
561 	if (cap_dns_family_limit(capdns, families, 1) < 0)
562 		errx(1, "unable to limit access to system.dns service");
563 #endif /* WITH_CASPER */
564 
565 #ifdef IPCTL_DEFTTL
566 	{
567 		int mib[4] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL };
568 		size_t sz = sizeof(max_ttl);
569 
570 		if (sysctl(mib, 4, &max_ttl, &sz, NULL, 0) == -1) {
571 			perror("sysctl(net.inet.ip.ttl)");
572 			exit(1);
573 		}
574 	}
575 #else /* !IPCTL_DEFTTL */
576 	max_ttl = 30;
577 #endif
578 
579 #ifdef WITH_CASPER
580 	cap_close(casper);
581 #endif
582 
583 	if (argv[0] == NULL)
584 		prog = "traceroute";
585 	else if ((cp = strrchr(argv[0], '/')) != NULL)
586 		prog = cp + 1;
587 	else
588 		prog = argv[0];
589 
590 	opterr = 0;
591 	while ((op = getopt(argc, argv, "aA:edDFInrSvxf:g:i:M:m:P:p:q:s:t:w:z:")) != EOF)
592 		switch (op) {
593 		case 'a':
594 			as_path = 1;
595 			break;
596 
597 		case 'A':
598 			as_path = 1;
599 			as_server = optarg;
600 			break;
601 
602 		case 'd':
603 			options |= SO_DEBUG;
604 			break;
605 
606 		case 'D':
607 			printdiff = 1;
608 			break;
609 
610 		case 'e':
611 			fixedPort = 1;
612 			break;
613 
614 #ifndef __HAIKU__
615 		case 'E':
616 			ecnflag = 1;
617 			break;
618 #endif
619 
620 		case 'f':
621 		case 'M':	/* FreeBSD compat. */
622 			first_ttl = str2val(optarg, "first ttl", 1, 255);
623 			break;
624 
625 		case 'F':
626 			off = IP_DF;
627 			break;
628 
629 		case 'g':
630 			if (lsrr >= NGATEWAYS) {
631 				Fprintf(stderr,
632 				    "%s: No more than %d gateways\n",
633 				    prog, NGATEWAYS);
634 				exit(1);
635 			}
636 			getaddr(gwlist + lsrr, optarg);
637 			++lsrr;
638 			break;
639 
640 		case 'i':
641 			device = optarg;
642 			break;
643 
644 		case 'I':
645 			proto = setproto("icmp");
646 			break;
647 
648 		case 'm':
649 			max_ttl = str2val(optarg, "max ttl", 1, 255);
650 			break;
651 
652 		case 'n':
653 			++nflag;
654 			break;
655 
656 		case 'P':
657 			proto = setproto(optarg);
658 			break;
659 
660 		case 'p':
661 			requestPort = (u_short)str2val(optarg, "port",
662 			    1, (1 << 16) - 1);
663 			break;
664 
665 		case 'q':
666 			nprobes = str2val(optarg, "nprobes", 1, -1);
667 			break;
668 
669 		case 'r':
670 			options |= SO_DONTROUTE;
671 			break;
672 
673 		case 's':
674 			/*
675 			 * set the ip source address of the outbound
676 			 * probe (e.g., on a multi-homed host).
677 			 */
678 			source = optarg;
679 			break;
680 
681 		case 'S':
682 			sump = 1;
683 			break;
684 
685 		case 't':
686 			tos = str2val(optarg, "tos", 0, 255);
687 			++settos;
688 			break;
689 
690 		case 'v':
691 			++verbose;
692 			break;
693 
694 		case 'x':
695 			doipcksum = (doipcksum == 0);
696 			break;
697 
698 		case 'w':
699 			waittime = str2val(optarg, "wait time",
700 			    1, 24 * 60 * 60);
701 			break;
702 
703 		case 'z':
704 			pausemsecs = str2val(optarg, "pause msecs",
705 			    0, 60 * 60 * 1000);
706 			break;
707 
708 		default:
709 			usage();
710 		}
711 
712 	/* Set requested port, if any, else default for this protocol */
713 	port = (requestPort != -1) ? requestPort : proto->port;
714 
715 	if (nprobes == -1)
716 		nprobes = printdiff ? 1 : 3;
717 
718 	if (first_ttl > max_ttl) {
719 		Fprintf(stderr,
720 		    "%s: first ttl (%d) may not be greater than max ttl (%d)\n",
721 		    prog, first_ttl, max_ttl);
722 		exit(1);
723 	}
724 
725 	if (!doipcksum)
726 		Fprintf(stderr, "%s: Warning: ip checksums disabled\n", prog);
727 
728 	if (lsrr > 0)
729 		optlen = (lsrr + 1) * sizeof(gwlist[0]);
730 	minpacket = sizeof(*outip) + proto->hdrlen + optlen;
731 	if (minpacket > 40)
732 		packlen = minpacket;
733 	else
734 		packlen = 40;
735 
736 	/* Process destination and optional packet size */
737 	switch (argc - optind) {
738 
739 	case 2:
740 		packlen = str2val(argv[optind + 1],
741 		    "packet length", minpacket, maxpacket);
742 		/* Fall through */
743 
744 	case 1:
745 		hostname = argv[optind];
746 		hi = gethostinfo(hostname);
747 		setsin(to, hi->addrs[0]);
748 		if (hi->n > 1)
749 			Fprintf(stderr,
750 		    "%s: Warning: %s has multiple addresses; using %s\n",
751 				prog, hostname, inet_ntoa(to->sin_addr));
752 		hostname = hi->name;
753 		hi->name = NULL;
754 		freehostinfo(hi);
755 		break;
756 
757 	default:
758 		usage();
759 	}
760 
761 	setlinebuf(stdout);
762 
763 	protlen = packlen - sizeof(*outip) - optlen;
764 #ifndef __HAIKU__
765 	if ((proto->num == IPPROTO_SCTP) && (packlen & 3)) {
766 		Fprintf(stderr, "%s: packet length must be a multiple of 4\n",
767 		    prog);
768 		exit(1);
769 	}
770 #endif
771 
772 	outip = (struct ip *)malloc((unsigned)packlen);
773 	if (outip == NULL) {
774 		Fprintf(stderr, "%s: malloc: %s\n", prog, strerror(errno));
775 		exit(1);
776 	}
777 	memset((char *)outip, 0, packlen);
778 
779 	outip->ip_v = IPVERSION;
780 	if (settos)
781 		outip->ip_tos = tos;
782 #ifndef __HAIKU__
783 	if (ecnflag) {
784 		outip->ip_tos &= ~IPTOS_ECN_MASK;
785 		outip->ip_tos |= IPTOS_ECN_ECT1;
786 	}
787 #endif
788 	outip->ip_len = htons(packlen);
789 	outip->ip_off = htons(off);
790 	outip->ip_p = proto->num;
791 	outp = (u_char *)(outip + 1);
792 	if (lsrr > 0) {
793 		register u_char *optlist;
794 
795 		optlist = outp;
796 		outp += optlen;
797 
798 		/* final hop */
799 		gwlist[lsrr] = to->sin_addr.s_addr;
800 
801 		outip->ip_dst.s_addr = gwlist[0];
802 
803 		/* force 4 byte alignment */
804 		optlist[0] = IPOPT_NOP;
805 		/* loose source route option */
806 		optlist[1] = IPOPT_LSRR;
807 		i = lsrr * sizeof(gwlist[0]);
808 		optlist[2] = i + 3;
809 		/* Pointer to LSRR addresses */
810 		optlist[3] = IPOPT_MINOFF;
811 		memcpy(optlist + 4, gwlist + 1, i);
812 	} else
813 		outip->ip_dst = to->sin_addr;
814 
815 	outip->ip_hl = (outp - (u_char *)outip) >> 2;
816 	ident = (getpid() & 0xffff) | 0x8000;
817 
818 	if (pe == NULL) {
819 		Fprintf(stderr, "%s: unknown protocol %s\n", prog, cp);
820 		exit(1);
821 	}
822 	if (s < 0) {
823 		errno = sockerrno;
824 		Fprintf(stderr, "%s: icmp socket: %s\n", prog, strerror(errno));
825 		exit(1);
826 	}
827 	if (options & SO_DEBUG)
828 		(void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&on,
829 		    sizeof(on));
830 	if (options & SO_DONTROUTE)
831 		(void)setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)&on,
832 		    sizeof(on));
833 
834 #if	defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
835 	if (setpolicy(s, "in bypass") < 0)
836 		errx(1, "%s", ipsec_strerror());
837 
838 	if (setpolicy(s, "out bypass") < 0)
839 		errx(1, "%s", ipsec_strerror());
840 #endif	/* defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) */
841 
842 	if (sndsock < 0) {
843 		errno = sockerrno;
844 		Fprintf(stderr, "%s: raw socket: %s\n", prog, strerror(errno));
845 		exit(1);
846 	}
847 
848 #ifdef SO_SNDBUF
849 	if (setsockopt(sndsock, SOL_SOCKET, SO_SNDBUF, (char *)&packlen,
850 	    sizeof(packlen)) < 0) {
851 		Fprintf(stderr, "%s: SO_SNDBUF: %s\n", prog, strerror(errno));
852 		exit(1);
853 	}
854 #endif
855 #ifdef IP_HDRINCL
856 	if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on,
857 	    sizeof(on)) < 0) {
858 		Fprintf(stderr, "%s: IP_HDRINCL: %s\n", prog, strerror(errno));
859 		exit(1);
860 	}
861 #else
862 #ifdef IP_TOS
863 	if (settos && setsockopt(sndsock, IPPROTO_IP, IP_TOS,
864 	    (char *)&tos, sizeof(tos)) < 0) {
865 		Fprintf(stderr, "%s: setsockopt tos %d: %s\n",
866 		    prog, tos, strerror(errno));
867 		exit(1);
868 	}
869 #endif
870 #endif
871 	if (options & SO_DEBUG)
872 		(void)setsockopt(sndsock, SOL_SOCKET, SO_DEBUG, (char *)&on,
873 		    sizeof(on));
874 	if (options & SO_DONTROUTE)
875 		(void)setsockopt(sndsock, SOL_SOCKET, SO_DONTROUTE, (char *)&on,
876 		    sizeof(on));
877 
878 	/* Get the interface address list */
879 	n = ifaddrlist(&al, errbuf);
880 	if (n < 0) {
881 		Fprintf(stderr, "%s: ifaddrlist: %s\n", prog, errbuf);
882 		exit(1);
883 	}
884 	if (n == 0) {
885 		Fprintf(stderr,
886 		    "%s: Can't find any network interfaces\n", prog);
887 		exit(1);
888 	}
889 
890 	/* Look for a specific device */
891 	if (device != NULL) {
892 		for (i = n; i > 0; --i, ++al)
893 			if (strcmp(device, al->device) == 0)
894 				break;
895 		if (i <= 0) {
896 			Fprintf(stderr, "%s: Can't find interface %.32s\n",
897 			    prog, device);
898 			exit(1);
899 		}
900 	}
901 
902 	/* Determine our source address */
903 	if (source == NULL) {
904 		/*
905 		 * If a device was specified, use the interface address.
906 		 * Otherwise, try to determine our source address.
907 		 */
908 		if (device != NULL)
909 			setsin(from, al->addr);
910 		else if ((err = findsaddr(to, from)) != NULL) {
911 			Fprintf(stderr, "%s: findsaddr: %s\n",
912 			    prog, err);
913 			exit(1);
914 		}
915 	} else {
916 		hi = gethostinfo(source);
917 		source = hi->name;
918 		hi->name = NULL;
919 		/*
920 		 * If the device was specified make sure it
921 		 * corresponds to the source address specified.
922 		 * Otherwise, use the first address (and warn if
923 		 * there are more than one).
924 		 */
925 		if (device != NULL) {
926 			for (i = hi->n, ap = hi->addrs; i > 0; --i, ++ap)
927 				if (*ap == al->addr)
928 					break;
929 			if (i <= 0) {
930 				Fprintf(stderr,
931 				    "%s: %s is not on interface %.32s\n",
932 				    prog, source, device);
933 				exit(1);
934 			}
935 			setsin(from, *ap);
936 		} else {
937 			setsin(from, hi->addrs[0]);
938 			if (hi->n > 1)
939 				Fprintf(stderr,
940 			"%s: Warning: %s has multiple addresses; using %s\n",
941 				    prog, source, inet_ntoa(from->sin_addr));
942 		}
943 		freehostinfo(hi);
944 	}
945 
946 	outip->ip_src = from->sin_addr;
947 
948 	/* Check the source address (-s), if any, is valid */
949 	if (bind(sndsock, (struct sockaddr *)from, sizeof(*from)) < 0) {
950 		Fprintf(stderr, "%s: bind: %s\n",
951 		    prog, strerror(errno));
952 		exit(1);
953 	}
954 
955 	if (as_path) {
956 		asn = as_setup(as_server);
957 		if (asn == NULL) {
958 			Fprintf(stderr, "%s: as_setup failed, AS# lookups"
959 			    " disabled\n", prog);
960 			(void)fflush(stderr);
961 			as_path = 0;
962 		}
963 	}
964 
965 #ifndef __HAIKU__
966 	if (connect(sndsock, (struct sockaddr *)&whereto,
967 	    sizeof(whereto)) != 0) {
968 		Fprintf(stderr, "%s: connect: %s\n", prog, strerror(errno));
969 		exit(1);
970 	}
971 #endif
972 
973 #ifdef WITH_CASPER
974 	cansandbox = true;
975 #else
976 	if (nflag)
977 		cansandbox = true;
978 	else
979 		cansandbox = false;
980 #endif
981 
982 #ifndef __HAIKU__
983 	caph_cache_catpages();
984 
985 	/*
986 	 * Here we enter capability mode. Further down access to global
987 	 * namespaces (e.g filesystem) is restricted (see capsicum(4)).
988 	 * We must connect(2) our socket before this point.
989 	 */
990 	if (cansandbox && cap_enter() < 0) {
991 		if (errno != ENOSYS) {
992 			Fprintf(stderr, "%s: cap_enter: %s\n", prog,
993 			    strerror(errno));
994 			exit(1);
995 		} else {
996 			cansandbox = false;
997 		}
998 	}
999 
1000 	cap_rights_init(&rights, CAP_SEND, CAP_SETSOCKOPT);
1001 	if (cansandbox && cap_rights_limit(sndsock, &rights) < 0) {
1002 		Fprintf(stderr, "%s: cap_rights_limit sndsock: %s\n", prog,
1003 		    strerror(errno));
1004 		exit(1);
1005 	}
1006 
1007 	cap_rights_init(&rights, CAP_RECV, CAP_EVENT);
1008 	if (cansandbox && cap_rights_limit(s, &rights) < 0) {
1009 		Fprintf(stderr, "%s: cap_rights_limit s: %s\n", prog,
1010 		    strerror(errno));
1011 		exit(1);
1012 	}
1013 #endif
1014 
1015 #if	defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
1016 	if (setpolicy(sndsock, "in bypass") < 0)
1017 		errx(1, "%s", ipsec_strerror());
1018 
1019 	if (setpolicy(sndsock, "out bypass") < 0)
1020 		errx(1, "%s", ipsec_strerror());
1021 #endif	/* defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) */
1022 
1023 	Fprintf(stderr, "%s to %s (%s)",
1024 	    prog, hostname, inet_ntoa(to->sin_addr));
1025 	if (source)
1026 		Fprintf(stderr, " from %s", source);
1027 	Fprintf(stderr, ", %d hops max, %d byte packets\n", max_ttl, packlen);
1028 	(void)fflush(stderr);
1029 
1030 	for (ttl = first_ttl; ttl <= max_ttl; ++ttl) {
1031 		u_int32_t lastaddr = 0;
1032 		int gotlastaddr = 0;
1033 		int got_there = 0;
1034 		int unreachable = 0;
1035 		int sentfirst = 0;
1036 		int loss;
1037 
1038 		Printf("%2d ", ttl);
1039 		for (probe = 0, loss = 0; probe < nprobes; ++probe) {
1040 			register int cc;
1041 			struct timeval t1, t2;
1042 			register struct ip *ip;
1043 			struct outdata outdata;
1044 
1045 			if (sentfirst && pausemsecs > 0)
1046 				usleep(pausemsecs * 1000);
1047 			/* Prepare outgoing data */
1048 			outdata.seq = ++seq;
1049 			outdata.ttl = ttl;
1050 
1051 			/* Avoid alignment problems by copying bytewise: */
1052 			(void)gettimeofday(&t1, NULL);
1053 			memcpy(&outdata.tv, &t1, sizeof(outdata.tv));
1054 
1055 			/* Finalize and send packet */
1056 			(*proto->prepare)(&outdata);
1057 			send_probe(seq, ttl);
1058 			++sentfirst;
1059 
1060 			/* Wait for a reply */
1061 			while ((cc = wait_for_reply(s, from, &t1)) != 0) {
1062 				double T;
1063 				int precis;
1064 
1065 				(void)gettimeofday(&t2, NULL);
1066 				i = packet_ok(packet, cc, from, seq);
1067 				/* Skip short packet */
1068 				if (i == 0)
1069 					continue;
1070 				if (!gotlastaddr ||
1071 				    from->sin_addr.s_addr != lastaddr) {
1072 					if (gotlastaddr)
1073 						printf("\n   ");
1074 					print(packet, cc, from);
1075 					lastaddr = from->sin_addr.s_addr;
1076 					++gotlastaddr;
1077 				}
1078 				T = deltaT(&t1, &t2);
1079 #ifdef SANE_PRECISION
1080 				if (T >= 1000.0)
1081 					precis = 0;
1082 				else if (T >= 100.0)
1083 					precis = 1;
1084 				else if (T >= 10.0)
1085 					precis = 2;
1086 				else
1087 #endif
1088 					precis = 3;
1089 				Printf("  %.*f ms", precis, T);
1090 #ifndef __HAIKU__
1091 				if (ecnflag) {
1092 					u_char ecn = hip->ip_tos & IPTOS_ECN_MASK;
1093 					switch (ecn) {
1094 					case IPTOS_ECN_ECT1:
1095 						Printf(" (ecn=passed)");
1096 						break;
1097 					case IPTOS_ECN_NOTECT:
1098 						Printf(" (ecn=bleached)");
1099 						break;
1100 					case IPTOS_ECN_CE:
1101 						Printf(" (ecn=congested)");
1102 						break;
1103 					default:
1104 						Printf(" (ecn=mangled)");
1105 						break;
1106 					}
1107 				}
1108 #endif
1109 				if (printdiff) {
1110 					Printf("\n");
1111 					Printf("%*.*s%s\n",
1112 					    -(outip->ip_hl << 3),
1113 					    outip->ip_hl << 3,
1114 					    ip_hdr_key,
1115 					    proto->key);
1116 					pkt_compare((void *)outip, packlen,
1117 					    (void *)hip, hiplen);
1118 				}
1119 				if (i == -2) {
1120 #ifndef ARCHAIC
1121 					ip = (struct ip *)packet;
1122 					if (ip->ip_ttl <= 1)
1123 						Printf(" !");
1124 #endif
1125 					++got_there;
1126 					break;
1127 				}
1128 				/* time exceeded in transit */
1129 				if (i == -1)
1130 					break;
1131 				code = i - 1;
1132 				switch (code) {
1133 
1134 				case ICMP_UNREACH_PORT:
1135 #ifndef ARCHAIC
1136 					ip = (struct ip *)packet;
1137 					if (ip->ip_ttl <= 1)
1138 						Printf(" !");
1139 #endif
1140 					++got_there;
1141 					break;
1142 
1143 				case ICMP_UNREACH_NET:
1144 					++unreachable;
1145 					Printf(" !N");
1146 					break;
1147 
1148 				case ICMP_UNREACH_HOST:
1149 					++unreachable;
1150 					Printf(" !H");
1151 					break;
1152 
1153 				case ICMP_UNREACH_PROTOCOL:
1154 					++got_there;
1155 					Printf(" !P");
1156 					break;
1157 
1158 				case ICMP_UNREACH_NEEDFRAG:
1159 					++unreachable;
1160 					Printf(" !F-%d", pmtu);
1161 					break;
1162 
1163 				case ICMP_UNREACH_SRCFAIL:
1164 					++unreachable;
1165 					Printf(" !S");
1166 					break;
1167 
1168 				case ICMP_UNREACH_NET_UNKNOWN:
1169 					++unreachable;
1170 					Printf(" !U");
1171 					break;
1172 
1173 				case ICMP_UNREACH_HOST_UNKNOWN:
1174 					++unreachable;
1175 					Printf(" !W");
1176 					break;
1177 
1178 				case ICMP_UNREACH_ISOLATED:
1179 					++unreachable;
1180 					Printf(" !I");
1181 					break;
1182 
1183 				case ICMP_UNREACH_NET_PROHIB:
1184 					++unreachable;
1185 					Printf(" !A");
1186 					break;
1187 
1188 				case ICMP_UNREACH_HOST_PROHIB:
1189 					++unreachable;
1190 					Printf(" !Z");
1191 					break;
1192 
1193 				case ICMP_UNREACH_TOSNET:
1194 					++unreachable;
1195 					Printf(" !Q");
1196 					break;
1197 
1198 				case ICMP_UNREACH_TOSHOST:
1199 					++unreachable;
1200 					Printf(" !T");
1201 					break;
1202 
1203 				case ICMP_UNREACH_FILTER_PROHIB:
1204 					++unreachable;
1205 					Printf(" !X");
1206 					break;
1207 
1208 				case ICMP_UNREACH_HOST_PRECEDENCE:
1209 					++unreachable;
1210 					Printf(" !V");
1211 					break;
1212 
1213 				case ICMP_UNREACH_PRECEDENCE_CUTOFF:
1214 					++unreachable;
1215 					Printf(" !C");
1216 					break;
1217 
1218 				default:
1219 					++unreachable;
1220 					Printf(" !<%d>", code);
1221 					break;
1222 				}
1223 				break;
1224 			}
1225 			if (cc == 0) {
1226 				loss++;
1227 				Printf(" *");
1228 			}
1229 			(void)fflush(stdout);
1230 		}
1231 		if (sump) {
1232 			Printf(" (%d%% loss)", (loss * 100) / nprobes);
1233 		}
1234 		putchar('\n');
1235 		if (got_there ||
1236 		    (unreachable > 0 && unreachable >= nprobes - 1))
1237 			break;
1238 	}
1239 	if (as_path)
1240 		as_shutdown(asn);
1241 	exit(0);
1242 }
1243 
1244 int
1245 wait_for_reply(register int sock, register struct sockaddr_in *fromp,
1246     register const struct timeval *tp)
1247 {
1248 	fd_set *fdsp;
1249 	size_t nfds;
1250 	struct timeval now, wait;
1251 	register int cc = 0;
1252 	register int error;
1253 	int fromlen = sizeof(*fromp);
1254 
1255 	nfds = howmany(sock + 1, NFDBITS);
1256 	if ((fdsp = malloc(nfds * sizeof(fd_mask))) == NULL)
1257 		err(1, "malloc");
1258 	memset(fdsp, 0, nfds * sizeof(fd_mask));
1259 	FD_SET(sock, fdsp);
1260 
1261 	wait.tv_sec = tp->tv_sec + waittime;
1262 	wait.tv_usec = tp->tv_usec;
1263 	(void)gettimeofday(&now, NULL);
1264 	tvsub(&wait, &now);
1265 	if (wait.tv_sec < 0) {
1266 		wait.tv_sec = 0;
1267 		wait.tv_usec = 1;
1268 	}
1269 
1270 	error = select(sock + 1, fdsp, NULL, NULL, &wait);
1271 	if (error == -1 && errno == EINVAL) {
1272 		Fprintf(stderr, "%s: botched select() args\n", prog);
1273 		exit(1);
1274 	}
1275 	if (error > 0)
1276 		cc = recvfrom(sock, (char *)packet, sizeof(packet), 0,
1277 			    (struct sockaddr *)fromp, &fromlen);
1278 
1279 	free(fdsp);
1280 	return (cc);
1281 }
1282 
1283 void
1284 send_probe(int seq, int ttl)
1285 {
1286 	register int cc;
1287 
1288 	outip->ip_ttl = ttl;
1289 	outip->ip_id = htons(ident + seq);
1290 
1291 	/* XXX undocumented debugging hack */
1292 	if (verbose > 1) {
1293 		register const u_short *sp;
1294 		register int nshorts, i;
1295 
1296 		sp = (u_short *)outip;
1297 		nshorts = (u_int)packlen / sizeof(u_short);
1298 		i = 0;
1299 		Printf("[ %d bytes", packlen);
1300 		while (--nshorts >= 0) {
1301 			if ((i++ % 8) == 0)
1302 				Printf("\n\t");
1303 			Printf(" %04x", ntohs(*sp++));
1304 		}
1305 		if (packlen & 1) {
1306 			if ((i % 8) == 0)
1307 				Printf("\n\t");
1308 			Printf(" %02x", *(u_char *)sp);
1309 		}
1310 		Printf("]\n");
1311 	}
1312 
1313 #if !defined(IP_HDRINCL) && defined(IP_TTL)
1314 	if (setsockopt(sndsock, IPPROTO_IP, IP_TTL,
1315 	    (char *)&ttl, sizeof(ttl)) < 0) {
1316 		Fprintf(stderr, "%s: setsockopt ttl %d: %s\n",
1317 		    prog, ttl, strerror(errno));
1318 		exit(1);
1319 	}
1320 #endif
1321 
1322 #ifndef __HAIKU__
1323 	cc = send(sndsock, (char *)outip, packlen, 0);
1324 #else
1325 	cc = sendto(sndsock, (char *)outip, packlen, 0, &whereto,
1326 		sizeof(struct sockaddr));
1327 #endif
1328 
1329 	if (cc < 0 || cc != packlen)  {
1330 		if (cc < 0)
1331 			Fprintf(stderr, "%s: sendto: %s\n",
1332 			    prog, strerror(errno));
1333 		Printf("%s: wrote %s %d chars, ret=%d\n",
1334 		    prog, hostname, packlen, cc);
1335 		(void)fflush(stdout);
1336 	}
1337 }
1338 
1339 #if	defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
1340 int
1341 setpolicy(int so, char *policy)
1342 {
1343 	char *buf;
1344 
1345 	buf = ipsec_set_policy(policy, strlen(policy));
1346 	if (buf == NULL) {
1347 		warnx("%s", ipsec_strerror());
1348 		return (-1);
1349 	}
1350 	(void)setsockopt(so, IPPROTO_IP, IP_IPSEC_POLICY,
1351 		buf, ipsec_get_policylen(buf));
1352 
1353 	free(buf);
1354 
1355 	return (0);
1356 }
1357 #endif
1358 
1359 double
1360 deltaT(struct timeval *t1p, struct timeval *t2p)
1361 {
1362 	register double dt;
1363 
1364 	dt = (double)(t2p->tv_sec - t1p->tv_sec) * 1000.0 +
1365 	     (double)(t2p->tv_usec - t1p->tv_usec) / 1000.0;
1366 	return (dt);
1367 }
1368 
1369 /*
1370  * Convert an ICMP "type" field to a printable string.
1371  */
1372 char *
1373 pr_type(register u_char t)
1374 {
1375 	static char *ttab[] = {
1376 	"Echo Reply",	"ICMP 1",	"ICMP 2",	"Dest Unreachable",
1377 	"Source Quench", "Redirect",	"ICMP 6",	"ICMP 7",
1378 	"Echo",		"ICMP 9",	"ICMP 10",	"Time Exceeded",
1379 	"Param Problem", "Timestamp",	"Timestamp Reply", "Info Request",
1380 	"Info Reply"
1381 	};
1382 
1383 	if (t > 16)
1384 		return ("OUT-OF-RANGE");
1385 
1386 	return (ttab[t]);
1387 }
1388 
1389 int
1390 packet_ok(register u_char *buf, int cc, register struct sockaddr_in *from,
1391     register int seq)
1392 {
1393 	register struct icmp *icp;
1394 	register u_char type, code;
1395 	register int hlen;
1396 #ifndef ARCHAIC
1397 	register struct ip *ip;
1398 
1399 	ip = (struct ip *) buf;
1400 	hlen = ip->ip_hl << 2;
1401 	if (cc < hlen + ICMP_MINLEN) {
1402 		if (verbose)
1403 			Printf("packet too short (%d bytes) from %s\n", cc,
1404 				inet_ntoa(from->sin_addr));
1405 		return (0);
1406 	}
1407 	cc -= hlen;
1408 	icp = (struct icmp *)(buf + hlen);
1409 #else
1410 	icp = (struct icmp *)buf;
1411 #endif
1412 	type = icp->icmp_type;
1413 	code = icp->icmp_code;
1414 	/* Path MTU Discovery (RFC1191) */
1415 	if (code != ICMP_UNREACH_NEEDFRAG)
1416 		pmtu = 0;
1417 	else {
1418 		pmtu = ntohs(icp->icmp_nextmtu);
1419 	}
1420 	if (type == ICMP_ECHOREPLY
1421 	    && proto->num == IPPROTO_ICMP
1422 	    && (*proto->check)((u_char *)icp, (u_char)seq))
1423 		return (-2);
1424 	if ((type == ICMP_TIMXCEED && code == ICMP_TIMXCEED_INTRANS) ||
1425 	    type == ICMP_UNREACH) {
1426 		u_char *inner;
1427 
1428 		hip = &icp->icmp_ip;
1429 		hiplen = ((u_char *)icp + cc) - (u_char *)hip;
1430 		hlen = hip->ip_hl << 2;
1431 		inner = (u_char *)((u_char *)hip + hlen);
1432 		if (hlen + 16 <= cc
1433 		    && hip->ip_p == proto->num
1434 		    && (*proto->check)(inner, (u_char)seq))
1435 			return (type == ICMP_TIMXCEED ? -1 : code + 1);
1436 	}
1437 #ifndef ARCHAIC
1438 	if (verbose) {
1439 		register int i;
1440 		u_int32_t *lp = (u_int32_t *)&icp->icmp_ip;
1441 
1442 		Printf("\n%d bytes from %s to ", cc, inet_ntoa(from->sin_addr));
1443 		Printf("%s: icmp type %d (%s) code %d\n",
1444 		    inet_ntoa(ip->ip_dst), type, pr_type(type), icp->icmp_code);
1445 		for (i = 4; i <= cc - ICMP_MINLEN; i += sizeof(*lp))
1446 			Printf("%2d: %8.8x\n", i, ntohl(*lp++));
1447 	}
1448 #endif
1449 	return (0);
1450 }
1451 
1452 void
1453 icmp_prep(struct outdata *outdata)
1454 {
1455 	struct icmp *const icmpheader = (struct icmp *) outp;
1456 
1457 	icmpheader->icmp_type = ICMP_ECHO;
1458 	icmpheader->icmp_id = htons(ident);
1459 	icmpheader->icmp_seq = htons(outdata->seq);
1460 	icmpheader->icmp_cksum = 0;
1461 	icmpheader->icmp_cksum = in_cksum((u_short *)icmpheader, protlen);
1462 	if (icmpheader->icmp_cksum == 0)
1463 		icmpheader->icmp_cksum = 0xffff;
1464 }
1465 
1466 int
1467 icmp_check(const u_char *data, int seq)
1468 {
1469 	struct icmp *const icmpheader = (struct icmp *) data;
1470 
1471 	return (icmpheader->icmp_id == htons(ident)
1472 	    && icmpheader->icmp_seq == htons(seq));
1473 }
1474 
1475 void
1476 udp_prep(struct outdata *outdata)
1477 {
1478 	struct udphdr *const outudp = (struct udphdr *) outp;
1479 
1480 	outudp->uh_sport = htons(ident + (fixedPort ? outdata->seq : 0));
1481 	outudp->uh_dport = htons(port + (fixedPort ? 0 : outdata->seq));
1482 	outudp->uh_ulen = htons((u_short)protlen);
1483 	outudp->uh_sum = 0;
1484 	if (doipcksum) {
1485 	    u_short sum = p_cksum(outip, (u_short *)outudp, protlen, protlen);
1486 	    outudp->uh_sum = (sum) ? sum : 0xffff;
1487 	}
1488 
1489 	return;
1490 }
1491 
1492 int
1493 udp_check(const u_char *data, int seq)
1494 {
1495 	struct udphdr *const udp = (struct udphdr *) data;
1496 
1497 	return (ntohs(udp->uh_sport) == ident + (fixedPort ? seq : 0) &&
1498 	    ntohs(udp->uh_dport) == port + (fixedPort ? 0 : seq));
1499 }
1500 
1501 void
1502 udplite_prep(struct outdata *outdata)
1503 {
1504 	struct udphdr *const outudp = (struct udphdr *) outp;
1505 
1506 	outudp->uh_sport = htons(ident + (fixedPort ? outdata->seq : 0));
1507 	outudp->uh_dport = htons(port + (fixedPort ? 0 : outdata->seq));
1508 	outudp->uh_ulen = htons(8);
1509 	outudp->uh_sum = 0;
1510 	if (doipcksum) {
1511 	    u_short sum = p_cksum(outip, (u_short *)outudp, protlen, 8);
1512 	    outudp->uh_sum = (sum) ? sum : 0xffff;
1513 	}
1514 
1515 	return;
1516 }
1517 
1518 int
1519 udplite_check(const u_char *data, int seq)
1520 {
1521 	struct udphdr *const udp = (struct udphdr *) data;
1522 
1523 	return (ntohs(udp->uh_sport) == ident + (fixedPort ? seq : 0) &&
1524 	    ntohs(udp->uh_dport) == port + (fixedPort ? 0 : seq));
1525 }
1526 
1527 void
1528 tcp_prep(struct outdata *outdata)
1529 {
1530 	struct tcphdr *const tcp = (struct tcphdr *) outp;
1531 
1532 	tcp->th_sport = htons(ident);
1533 	tcp->th_dport = htons(port + (fixedPort ? 0 : outdata->seq));
1534 	tcp->th_seq = (tcp->th_sport << 16) | tcp->th_dport;
1535 	tcp->th_ack = 0;
1536 	tcp->th_off = 5;
1537 	tcp->th_flags = 0x02; /* TH_SYN */
1538 	tcp->th_sum = 0;
1539 
1540 	if (doipcksum)
1541 	    tcp->th_sum = p_cksum(outip, (u_short *)tcp, protlen, protlen);
1542 }
1543 
1544 int
1545 tcp_check(const u_char *data, int seq)
1546 {
1547 	struct tcphdr *const tcp = (struct tcphdr *) data;
1548 
1549 	return (ntohs(tcp->th_sport) == ident
1550 	    && ntohs(tcp->th_dport) == port + (fixedPort ? 0 : seq)
1551 	    && tcp->th_seq == (u_int32_t)((tcp->th_sport << 16) | tcp->th_dport));
1552 }
1553 
1554 #ifndef __HAIKU__
1555 void
1556 sctp_prep(struct outdata *outdata)
1557 {
1558 	struct sctphdr *const sctp = (struct sctphdr *) outp;
1559 	struct sctp_chunkhdr *chk;
1560 	struct sctp_init_chunk *init;
1561 	struct sctp_paramhdr *param;
1562 
1563 	sctp->src_port = htons(ident);
1564 	sctp->dest_port = htons(port + (fixedPort ? 0 : outdata->seq));
1565 	if (protlen >= (int)(sizeof(struct sctphdr) +
1566 	    sizeof(struct sctp_init_chunk))) {
1567 		sctp->v_tag = 0;
1568 	} else {
1569 		sctp->v_tag = (sctp->src_port << 16) | sctp->dest_port;
1570 	}
1571 	sctp->checksum = htonl(0);
1572 	if (protlen >= (int)(sizeof(struct sctphdr) +
1573 	    sizeof(struct sctp_init_chunk))) {
1574 		/*
1575 		 * Send a packet containing an INIT chunk. This works
1576 		 * better in case of firewalls on the path, but
1577 		 * results in a probe packet containing at least
1578 		 * 32 bytes of payload. For shorter payloads, use
1579 		 * SHUTDOWN-ACK chunks.
1580 		 */
1581 		init = (struct sctp_init_chunk *)(sctp + 1);
1582 		init->ch.chunk_type = SCTP_INITIATION;
1583 		init->ch.chunk_flags = 0;
1584 		init->ch.chunk_length = htons((u_int16_t)(protlen -
1585 		    sizeof(struct sctphdr)));
1586 		init->init.initiate_tag = (sctp->src_port << 16) |
1587 		    sctp->dest_port;
1588 		init->init.a_rwnd = htonl(1500);
1589 		init->init.num_outbound_streams = htons(1);
1590 		init->init.num_inbound_streams = htons(1);
1591 		init->init.initial_tsn = htonl(0);
1592 		if (protlen >= (int)(sizeof(struct sctphdr) +
1593 		    sizeof(struct sctp_init_chunk) +
1594 		    sizeof(struct sctp_paramhdr))) {
1595 			param = (struct sctp_paramhdr *)(init + 1);
1596 			param->param_type = htons(SCTP_PAD);
1597 			param->param_length =
1598 			    htons((u_int16_t)(protlen -
1599 			    sizeof(struct sctphdr) -
1600 			    sizeof(struct sctp_init_chunk)));
1601 		}
1602 	} else {
1603 		/*
1604 		 * Send a packet containing a SHUTDOWN-ACK chunk,
1605 		 * possibly followed by a PAD chunk.
1606 		 */
1607 		if (protlen >=
1608 		    (int)(sizeof(struct sctphdr) +
1609 		    sizeof(struct sctp_chunkhdr))) {
1610 			chk = (struct sctp_chunkhdr *)(sctp + 1);
1611 			chk->chunk_type = SCTP_SHUTDOWN_ACK;
1612 			chk->chunk_flags = 0;
1613 			chk->chunk_length = htons(4);
1614 		}
1615 		if (protlen >=
1616 		    (int)(sizeof(struct sctphdr) +
1617 		    2 * sizeof(struct sctp_chunkhdr))) {
1618 			chk = chk + 1;
1619 			chk->chunk_type = SCTP_PAD_CHUNK;
1620 			chk->chunk_flags = 0;
1621 			chk->chunk_length = htons(protlen -
1622 			    (sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr)));
1623 		}
1624 	}
1625 	if (doipcksum) {
1626 		sctp->checksum = sctp_crc32c(sctp, protlen);
1627 	}
1628 }
1629 
1630 int
1631 sctp_check(const u_char *data, int seq)
1632 {
1633 	struct sctphdr *const sctp = (struct sctphdr *) data;
1634 
1635 	if (ntohs(sctp->src_port) != ident ||
1636 	    ntohs(sctp->dest_port) != port + (fixedPort ? 0 : seq))
1637 		return (0);
1638 	if (protlen < (int)(sizeof(struct sctphdr) +
1639 	    sizeof(struct sctp_init_chunk))) {
1640 		return (sctp->v_tag ==
1641 		    (u_int32_t)((sctp->src_port << 16) | sctp->dest_port));
1642 	} else {
1643 		/*
1644 		 * Don't verify the initiate_tag, since it is not available,
1645 		 * most of the time.
1646 		 */
1647 		return (sctp->v_tag == 0);
1648 	}
1649 }
1650 #endif
1651 
1652 void
1653 gre_prep(struct outdata *outdata)
1654 {
1655 	struct grehdr *const gre = (struct grehdr *) outp;
1656 
1657 	gre->flags = htons(0x2001);
1658 	gre->proto = htons(port);
1659 	gre->length = 0;
1660 	gre->callId = htons(ident + outdata->seq);
1661 }
1662 
1663 int
1664 gre_check(const u_char *data, int seq)
1665 {
1666 	struct grehdr *const gre = (struct grehdr *) data;
1667 
1668 	return (ntohs(gre->proto) == port
1669 	    && ntohs(gre->callId) == ident + seq);
1670 }
1671 
1672 void
1673 gen_prep(struct outdata *outdata)
1674 {
1675 	u_int16_t *const ptr = (u_int16_t *) outp;
1676 
1677 	ptr[0] = htons(ident);
1678 	ptr[1] = htons(port + outdata->seq);
1679 }
1680 
1681 int
1682 gen_check(const u_char *data, int seq)
1683 {
1684 	u_int16_t *const ptr = (u_int16_t *) data;
1685 
1686 	return (ntohs(ptr[0]) == ident
1687 	    && ntohs(ptr[1]) == port + seq);
1688 }
1689 
1690 void
1691 print(register u_char *buf, register int cc, register struct sockaddr_in *from)
1692 {
1693 	register struct ip *ip;
1694 	register int hlen;
1695 	char addr[INET_ADDRSTRLEN];
1696 
1697 	ip = (struct ip *) buf;
1698 	hlen = ip->ip_hl << 2;
1699 	cc -= hlen;
1700 
1701 	strlcpy(addr, inet_ntoa(from->sin_addr), sizeof(addr));
1702 
1703 	if (as_path)
1704 		Printf(" [AS%u]", as_lookup(asn, addr, AF_INET));
1705 
1706 	if (nflag)
1707 		Printf(" %s", addr);
1708 	else
1709 		Printf(" %s (%s)", inetname(from->sin_addr), addr);
1710 
1711 	if (verbose)
1712 		Printf(" %d bytes to %s", cc, inet_ntoa(ip->ip_dst));
1713 }
1714 
1715 /*
1716  * Checksum routine for UDP and TCP headers.
1717  */
1718 u_short
1719 p_cksum(struct ip *ip, u_short *data, int len, int cov)
1720 {
1721 	static struct ipovly ipo;
1722 	u_short sum[2];
1723 
1724 	ipo.ih_pr = ip->ip_p;
1725 	ipo.ih_len = htons(len);
1726 	ipo.ih_src = ip->ip_src;
1727 	ipo.ih_dst = ip->ip_dst;
1728 
1729 	sum[1] = in_cksum((u_short *)&ipo, sizeof(ipo)); /* pseudo ip hdr cksum */
1730 	sum[0] = in_cksum(data, cov);                    /* payload data cksum */
1731 
1732 	return (~in_cksum(sum, sizeof(sum)));
1733 }
1734 
1735 /*
1736  * Checksum routine for Internet Protocol family headers (C Version)
1737  */
1738 u_short
1739 in_cksum(register u_short *addr, register int len)
1740 {
1741 	register int nleft = len;
1742 	register u_short *w = addr;
1743 	register u_short answer;
1744 	register int sum = 0;
1745 
1746 	/*
1747 	 *  Our algorithm is simple, using a 32 bit accumulator (sum),
1748 	 *  we add sequential 16 bit words to it, and at the end, fold
1749 	 *  back all the carry bits from the top 16 bits into the lower
1750 	 *  16 bits.
1751 	 */
1752 	while (nleft > 1)  {
1753 		sum += *w++;
1754 		nleft -= 2;
1755 	}
1756 
1757 	/* mop up an odd byte, if necessary */
1758 	if (nleft == 1)
1759 		sum += *(u_char *)w;
1760 
1761 	/*
1762 	 * add back carry outs from top 16 bits to low 16 bits
1763 	 */
1764 	sum = (sum >> 16) + (sum & 0xffff);	/* add hi 16 to low 16 */
1765 	sum += (sum >> 16);			/* add carry */
1766 	answer = ~sum;				/* truncate to 16 bits */
1767 	return (answer);
1768 }
1769 
1770 /*
1771  * CRC32C routine for the Stream Control Transmission Protocol
1772  */
1773 
1774 #define CRC32C(c, d) (c = (c >> 8) ^ crc_c[(c ^ (d)) & 0xFF])
1775 
1776 static u_int32_t crc_c[256] = {
1777 	0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
1778 	0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
1779 	0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
1780 	0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
1781 	0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
1782 	0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
1783 	0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
1784 	0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
1785 	0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
1786 	0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
1787 	0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
1788 	0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
1789 	0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
1790 	0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
1791 	0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
1792 	0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
1793 	0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
1794 	0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
1795 	0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
1796 	0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
1797 	0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
1798 	0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
1799 	0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
1800 	0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
1801 	0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
1802 	0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
1803 	0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
1804 	0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
1805 	0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
1806 	0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
1807 	0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
1808 	0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
1809 	0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
1810 	0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
1811 	0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
1812 	0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
1813 	0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
1814 	0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
1815 	0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
1816 	0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
1817 	0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
1818 	0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
1819 	0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
1820 	0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
1821 	0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
1822 	0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
1823 	0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
1824 	0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
1825 	0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
1826 	0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
1827 	0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
1828 	0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
1829 	0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
1830 	0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
1831 	0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
1832 	0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
1833 	0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
1834 	0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
1835 	0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
1836 	0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
1837 	0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
1838 	0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
1839 	0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
1840 	0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
1841 };
1842 
1843 u_int32_t
1844 sctp_crc32c(const void *packet, u_int32_t len)
1845 {
1846 	u_int32_t i, crc32c;
1847 	u_int8_t byte0, byte1, byte2, byte3;
1848 	const u_int8_t *buf = (const u_int8_t *)packet;
1849 
1850 	crc32c = ~0;
1851 	for (i = 0; i < len; i++)
1852 		CRC32C(crc32c, buf[i]);
1853 	crc32c = ~crc32c;
1854 	byte0  = crc32c & 0xff;
1855 	byte1  = (crc32c >> 8) & 0xff;
1856 	byte2  = (crc32c >> 16) & 0xff;
1857 	byte3  = (crc32c >> 24) & 0xff;
1858 	crc32c = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3);
1859 	return (htonl(crc32c));
1860 }
1861 
1862 /*
1863  * Subtract 2 timeval structs:  out = out - in.
1864  * Out is assumed to be within about LONG_MAX seconds of in.
1865  */
1866 void
1867 tvsub(register struct timeval *out, register struct timeval *in)
1868 {
1869 
1870 	if ((out->tv_usec -= in->tv_usec) < 0)   {
1871 		--out->tv_sec;
1872 		out->tv_usec += 1000000;
1873 	}
1874 	out->tv_sec -= in->tv_sec;
1875 }
1876 
1877 /*
1878  * Construct an Internet address representation.
1879  * If the nflag has been supplied, give
1880  * numeric value, otherwise try for symbolic name.
1881  */
1882 char *
1883 inetname(struct in_addr in)
1884 {
1885 	register char *cp;
1886 	register struct hostent *hp;
1887 	static int first = 1;
1888 	static char domain[MAXHOSTNAMELEN + 1], line[MAXHOSTNAMELEN + 1];
1889 
1890 	if (first && !nflag) {
1891 		first = 0;
1892 		if (gethostname(domain, sizeof(domain) - 1) < 0)
1893 			domain[0] = '\0';
1894 		else {
1895 			cp = strchr(domain, '.');
1896 			if (cp == NULL) {
1897 #ifdef WITH_CASPER
1898 				if (capdns != NULL)
1899 					hp = cap_gethostbyname(capdns, domain);
1900 				else
1901 #endif
1902 					hp = gethostbyname(domain);
1903 				if (hp != NULL)
1904 					cp = strchr(hp->h_name, '.');
1905 			}
1906 			if (cp == NULL)
1907 				domain[0] = '\0';
1908 			else {
1909 				++cp;
1910 				(void)strncpy(domain, cp, sizeof(domain) - 1);
1911 				domain[sizeof(domain) - 1] = '\0';
1912 			}
1913 		}
1914 	}
1915 	if (!nflag && in.s_addr != INADDR_ANY) {
1916 #ifdef WITH_CASPER
1917 		if (capdns != NULL)
1918 			hp = cap_gethostbyaddr(capdns, (char *)&in, sizeof(in),
1919 			    AF_INET);
1920 		else
1921 #endif
1922 			hp = gethostbyaddr((char *)&in, sizeof(in), AF_INET);
1923 		if (hp != NULL) {
1924 			if ((cp = strchr(hp->h_name, '.')) != NULL &&
1925 			    strcmp(cp + 1, domain) == 0)
1926 				*cp = '\0';
1927 			(void)strncpy(line, hp->h_name, sizeof(line) - 1);
1928 			line[sizeof(line) - 1] = '\0';
1929 			return (line);
1930 		}
1931 	}
1932 	return (inet_ntoa(in));
1933 }
1934 
1935 struct hostinfo *
1936 gethostinfo(register char *hostname)
1937 {
1938 	register int n;
1939 	register struct hostent *hp;
1940 	register struct hostinfo *hi;
1941 	register char **p;
1942 	register u_int32_t addr, *ap;
1943 
1944 	if (strlen(hostname) >= MAXHOSTNAMELEN) {
1945 		Fprintf(stderr, "%s: hostname \"%.32s...\" is too long\n",
1946 		    prog, hostname);
1947 		exit(1);
1948 	}
1949 	hi = calloc(1, sizeof(*hi));
1950 	if (hi == NULL) {
1951 		Fprintf(stderr, "%s: calloc %s\n", prog, strerror(errno));
1952 		exit(1);
1953 	}
1954 	addr = inet_addr(hostname);
1955 	if ((int32_t)addr != -1) {
1956 		hi->name = strdup(hostname);
1957 		hi->n = 1;
1958 		hi->addrs = calloc(1, sizeof(hi->addrs[0]));
1959 		if (hi->addrs == NULL) {
1960 			Fprintf(stderr, "%s: calloc %s\n",
1961 			    prog, strerror(errno));
1962 			exit(1);
1963 		}
1964 		hi->addrs[0] = addr;
1965 		return (hi);
1966 	}
1967 
1968 #ifdef WITH_CASPER
1969 	if (capdns != NULL)
1970 		hp = cap_gethostbyname(capdns, hostname);
1971 	else
1972 #endif
1973 		hp = gethostbyname(hostname);
1974 	if (hp == NULL) {
1975 		Fprintf(stderr, "%s: unknown host %s\n", prog, hostname);
1976 		exit(1);
1977 	}
1978 	if (hp->h_addrtype != AF_INET || hp->h_length != 4) {
1979 		Fprintf(stderr, "%s: bad host %s\n", prog, hostname);
1980 		exit(1);
1981 	}
1982 	hi->name = strdup(hp->h_name);
1983 	for (n = 0, p = hp->h_addr_list; *p != NULL; ++n, ++p)
1984 		continue;
1985 	hi->n = n;
1986 	hi->addrs = calloc(n, sizeof(hi->addrs[0]));
1987 	if (hi->addrs == NULL) {
1988 		Fprintf(stderr, "%s: calloc %s\n", prog, strerror(errno));
1989 		exit(1);
1990 	}
1991 	for (ap = hi->addrs, p = hp->h_addr_list; *p != NULL; ++ap, ++p)
1992 		memcpy(ap, *p, sizeof(*ap));
1993 	return (hi);
1994 }
1995 
1996 void
1997 freehostinfo(register struct hostinfo *hi)
1998 {
1999 	if (hi->name != NULL) {
2000 		free(hi->name);
2001 		hi->name = NULL;
2002 	}
2003 	free((char *)hi->addrs);
2004 	free((char *)hi);
2005 }
2006 
2007 void
2008 getaddr(register u_int32_t *ap, register char *hostname)
2009 {
2010 	register struct hostinfo *hi;
2011 
2012 	hi = gethostinfo(hostname);
2013 	*ap = hi->addrs[0];
2014 	freehostinfo(hi);
2015 }
2016 
2017 void
2018 setsin(register struct sockaddr_in *sin, register u_int32_t addr)
2019 {
2020 
2021 	memset(sin, 0, sizeof(*sin));
2022 	sin->sin_len = sizeof(*sin);
2023 	sin->sin_family = AF_INET;
2024 	sin->sin_addr.s_addr = addr;
2025 }
2026 
2027 /* String to value with optional min and max. Handles decimal and hex. */
2028 int
2029 str2val(register const char *str, register const char *what,
2030     register int mi, register int ma)
2031 {
2032 	register const char *cp;
2033 	register int val;
2034 	char *ep;
2035 
2036 	if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
2037 		cp = str + 2;
2038 		val = (int)strtol(cp, &ep, 16);
2039 	} else
2040 		val = (int)strtol(str, &ep, 10);
2041 	if (*ep != '\0') {
2042 		Fprintf(stderr, "%s: \"%s\" bad value for %s\n",
2043 		    prog, str, what);
2044 		exit(1);
2045 	}
2046 	if (val < mi && mi >= 0) {
2047 		if (mi == 0)
2048 			Fprintf(stderr, "%s: %s must be >= %d\n",
2049 			    prog, what, mi);
2050 		else
2051 			Fprintf(stderr, "%s: %s must be > %d\n",
2052 			    prog, what, mi - 1);
2053 		exit(1);
2054 	}
2055 	if (val > ma && ma >= 0) {
2056 		Fprintf(stderr, "%s: %s must be <= %d\n", prog, what, ma);
2057 		exit(1);
2058 	}
2059 	return (val);
2060 }
2061 
2062 struct outproto *
2063 setproto(char *pname)
2064 {
2065 	struct outproto *proto;
2066 	int i;
2067 
2068 	for (i = 0; protos[i].name != NULL; i++) {
2069 		if (strcasecmp(protos[i].name, pname) == 0) {
2070 			break;
2071 		}
2072 	}
2073 	proto = &protos[i];
2074 	if (proto->name == NULL) {	/* generic handler */
2075 		struct protoent *pe;
2076 		u_long pnum;
2077 
2078 		/* Determine the IP protocol number */
2079 		if ((pe = getprotobyname(pname)) != NULL)
2080 			pnum = pe->p_proto;
2081 		else
2082 			pnum = str2val(optarg, "proto number", 1, 255);
2083 		proto->num = pnum;
2084 	}
2085 	return (proto);
2086 }
2087 
2088 void
2089 pkt_compare(const u_char *a, int la, const u_char *b, int lb) {
2090 	int l;
2091 	int i;
2092 
2093 	for (i = 0; i < la; i++)
2094 		Printf("%02x", (unsigned int)a[i]);
2095 	Printf("\n");
2096 	l = (la <= lb) ? la : lb;
2097 	for (i = 0; i < l; i++)
2098 		if (a[i] == b[i])
2099 			Printf("__");
2100 		else
2101 			Printf("%02x", (unsigned int)b[i]);
2102 	for (; i < lb; i++)
2103 		Printf("%02x", (unsigned int)b[i]);
2104 	Printf("\n");
2105 }
2106 
2107 
2108 void
2109 usage(void)
2110 {
2111 	Fprintf(stderr,
2112 	    "Usage: %s [-adDeEFInrSvx] [-A as_server] [-f first_ttl] [-g gateway]\n"
2113 	    "\t[-i iface] [-m max_ttl] [-M first_ttl] [-p port] [-P proto]\n"
2114 	    "\t[-q nprobes] [-s src_addr] [-t tos] [-w waittime]\n"
2115 	    "\t[-z pausemsecs] host [packetlen]\n", prog);
2116 	exit(1);
2117 }
2118