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