Annotation of embedaddon/trafshow/addrtoname.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
! 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: * Internet, ethernet, port, and protocol string to address
! 22: * and address to string conversion routines
! 23:
! 24: #ifndef lint
! 25: static const char rcsid[] _U_ =
! 26: "@(#) $Header: /tcpdump/master/tcpdump/addrtoname.c,v 1.96.2.3 2003/12/15 04:02:53 guy Exp $ (LBL)";
! 27: #endif
! 28: */
! 29:
! 30: #ifdef HAVE_CONFIG_H
! 31: #include "config.h"
! 32: #endif
! 33:
! 34: #include <ctype.h>
! 35: #include <unistd.h>
! 36: #include <netdb.h>
! 37: #include <sys/param.h>
! 38: #include <sys/types.h> /* concession to AIX */
! 39: #include <sys/time.h>
! 40: #include <sys/socket.h>
! 41: #ifdef linux
! 42: #include <linux/if.h>
! 43: #else
! 44: #include <net/if.h>
! 45: #endif
! 46: #include <netinet/in.h>
! 47: #include <netinet/if_ether.h>
! 48: #ifdef HAVE_NET_IF_DL_H
! 49: #include <net/if_dl.h>
! 50: #endif
! 51: #ifdef TIME_WITH_SYS_TIME
! 52: #include <time.h>
! 53: #endif
! 54:
! 55: #include <arpa/inet.h>
! 56:
! 57: #include <pcap.h>
! 58: #include <pcap-namedb.h>
! 59: #include <signal.h>
! 60: #include <stdio.h>
! 61: #include <string.h>
! 62: #include <stdlib.h>
! 63:
! 64: #include "addrtoname.h"
! 65: #include "ethertype.h"
! 66: #include "domain_resolver.h"
! 67:
! 68: #ifndef NTOHL
! 69: #define NTOHL(x) (x) = ntohl(x)
! 70: #define NTOHS(x) (x) = ntohs(x)
! 71: #define HTONL(x) (x) = htonl(x)
! 72: #define HTONS(x) (x) = htons(x)
! 73: #endif
! 74:
! 75: /* dirty fake */
! 76: #define error(s) { perror(s); exit(1); }
! 77:
! 78: struct tok {
! 79: int v; /* value */
! 80: const char *s; /* string */
! 81: };
! 82:
! 83: /*
! 84: * hash tables for whatever-to-name translations
! 85: *
! 86: * XXX there has to be error checks against strdup(3) failure
! 87: */
! 88:
! 89: #define HASHNAMESIZE 4096
! 90:
! 91: struct hnamemem {
! 92: int resolving;
! 93: u_int32_t addr;
! 94: const char *name;
! 95: struct hnamemem *nxt;
! 96: };
! 97:
! 98: struct hnamemem hnametable[HASHNAMESIZE];
! 99: struct hnamemem tporttable[HASHNAMESIZE];
! 100: struct hnamemem uporttable[HASHNAMESIZE];
! 101: struct hnamemem servtable[HASHNAMESIZE];
! 102: struct hnamemem iprototable[HASHNAMESIZE];
! 103: struct hnamemem etypetable[HASHNAMESIZE];
! 104: struct hnamemem dnaddrtable[HASHNAMESIZE];
! 105: struct hnamemem llcsaptable[HASHNAMESIZE];
! 106: struct hnamemem ipxsaptable[HASHNAMESIZE];
! 107: struct hnamemem icmptable[HASHNAMESIZE];
! 108: #ifdef INET6
! 109: struct hnamemem icmpv6table[HASHNAMESIZE];
! 110: #endif
! 111:
! 112: #ifdef INET6
! 113: struct h6namemem {
! 114: struct in6_addr addr;
! 115: char *name;
! 116: struct h6namemem *nxt;
! 117: };
! 118:
! 119: struct h6namemem h6nametable[HASHNAMESIZE];
! 120: #endif /* INET6 */
! 121:
! 122: struct enamemem {
! 123: u_short e_addr0;
! 124: u_short e_addr1;
! 125: u_short e_addr2;
! 126: const char *e_name;
! 127: u_char *e_nsap; /* used only for nsaptable[] */
! 128: #define e_bs e_nsap /* for bytestringtable */
! 129: struct enamemem *e_nxt;
! 130: };
! 131:
! 132: struct enamemem enametable[HASHNAMESIZE];
! 133: struct enamemem nsaptable[HASHNAMESIZE];
! 134: struct enamemem bytestringtable[HASHNAMESIZE];
! 135:
! 136: struct protoidmem {
! 137: u_int32_t p_oui;
! 138: u_short p_proto;
! 139: const char *p_name;
! 140: struct protoidmem *p_nxt;
! 141: };
! 142:
! 143: struct protoidmem protoidtable[HASHNAMESIZE];
! 144:
! 145: char *
! 146: satoa(sa, dst, size)
! 147: const struct sockaddr *sa;
! 148: char *dst;
! 149: int size;
! 150: {
! 151: const char *cp = 0;
! 152: #ifdef INET6
! 153: char buf[100];
! 154: #endif
! 155: if (!sa || !dst || size < 1)
! 156: return 0;
! 157: if (sa->sa_family == AF_INET) {
! 158: cp = intoa(((struct sockaddr_in *)sa)->sin_addr.s_addr);
! 159: }
! 160: #ifdef INET6
! 161: else if (sa->sa_family == AF_INET6) {
! 162: cp = inet_ntop(AF_INET6,
! 163: &((struct sockaddr_in6 *)sa)->sin6_addr,
! 164: buf, sizeof(buf));
! 165: }
! 166: #endif
! 167: #if defined(AF_LINK) && defined(LLADDR)
! 168: else if (sa->sa_family == AF_LINK) {
! 169: struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
! 170: if (sdl->sdl_alen > 0)
! 171: cp = linkaddr_string((u_char *)LLADDR(sdl), sdl->sdl_alen);
! 172: }
! 173: #endif
! 174: if (!cp) return 0;
! 175: (void)strncpy(dst, cp, size);
! 176: dst[size-1] = '\0';
! 177: return dst;
! 178: }
! 179:
! 180: /*
! 181: * A faster replacement for inet_ntoa().
! 182: */
! 183: const char *
! 184: intoa(u_int32_t addr)
! 185: {
! 186: register char *cp;
! 187: register u_int byte;
! 188: register int n;
! 189: static char buf[sizeof(".xxx.xxx.xxx.xxx")];
! 190:
! 191: NTOHL(addr);
! 192: cp = &buf[sizeof buf];
! 193: *--cp = '\0';
! 194:
! 195: n = 4;
! 196: do {
! 197: byte = addr & 0xff;
! 198: *--cp = byte % 10 + '0';
! 199: byte /= 10;
! 200: if (byte > 0) {
! 201: *--cp = byte % 10 + '0';
! 202: byte /= 10;
! 203: if (byte > 0)
! 204: *--cp = byte + '0';
! 205: }
! 206: *--cp = '.';
! 207: addr >>= 8;
! 208: } while (--n > 0);
! 209:
! 210: return cp + 1;
! 211: }
! 212:
! 213: extern int nflag;
! 214:
! 215: static void
! 216: name_resolved(unused, dd)
! 217: void *unused;
! 218: DOMAIN_DATA *dd;
! 219: {
! 220: register struct hnamemem *p;
! 221:
! 222: /* sanity check */
! 223: if (unused || !dd) return;
! 224:
! 225: p = &hnametable[dd->addr & (HASHNAMESIZE-1)];
! 226: for (; p->nxt; p = p->nxt) {
! 227: if (p->addr == dd->addr) {
! 228: if (p->name) free((char *)p->name);
! 229: p->name = strdup(dd->name);
! 230: p->resolving = 2;
! 231: break;
! 232: }
! 233: }
! 234: domain_data_free(&dd, 0);
! 235: }
! 236:
! 237: /*
! 238: * Return a name for the IP address pointed to by ap. This address
! 239: * is assumed to be in network byte order.
! 240: */
! 241: const char *
! 242: getname(const u_char *ap)
! 243: {
! 244: u_int32_t addr;
! 245: register struct hnamemem *p;
! 246: int found;
! 247:
! 248: memcpy(&addr, ap, sizeof(addr));
! 249:
! 250: /*
! 251: * Do not print names if -n was given.
! 252: */
! 253: if (nflag)
! 254: return intoa(addr);
! 255:
! 256: found = 0;
! 257: p = &hnametable[addr & (HASHNAMESIZE-1)];
! 258: for (; p->nxt; p = p->nxt) {
! 259: if (p->addr == addr) {
! 260: found++;
! 261: break;
! 262: }
! 263: }
! 264: if (!found) {
! 265: p->addr = addr;
! 266: p->nxt = newhnamemem();
! 267: p->name = strdup(intoa(addr));
! 268: }
! 269: if (!p->resolving) {
! 270: if (domain_resolve_name(addr, 0, name_resolved) < 0)
! 271: p->resolving = -1;
! 272: else p->resolving = 1;
! 273: }
! 274: return (p->name);
! 275: }
! 276:
! 277: #ifdef INET6
! 278: /*
! 279: * Return a name for the IP6 address pointed to by ap. This address
! 280: * is assumed to be in network byte order.
! 281: */
! 282: const char *
! 283: getname6(const u_char *ap)
! 284: {
! 285: struct hostent *hp;
! 286: struct in6_addr addr;
! 287: static struct h6namemem *p; /* static for longjmp() */
! 288: const char *cp;
! 289: char ntop_buf[INET6_ADDRSTRLEN];
! 290:
! 291: memcpy(&addr, ap, sizeof(addr));
! 292:
! 293: /*
! 294: * Do not print names if -n was given.
! 295: */
! 296: if (nflag)
! 297: return inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
! 298:
! 299: p = &h6nametable[*(u_int16_t *)&addr.s6_addr[14] & (HASHNAMESIZE-1)];
! 300: for (; p->nxt; p = p->nxt) {
! 301: if (memcmp(&p->addr, &addr, sizeof(addr)) == 0)
! 302: return (p->name);
! 303: }
! 304: p->addr = addr;
! 305: p->nxt = newh6namemem();
! 306:
! 307: hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
! 308: if (hp) {
! 309: p->name = strdup(hp->h_name);
! 310: return (p->name);
! 311: }
! 312: cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
! 313: if (!cp) return 0;
! 314: p->name = strdup(cp);
! 315: return (p->name);
! 316: }
! 317: #endif /* INET6 */
! 318:
! 319: static char hex[] = "0123456789abcdef";
! 320:
! 321:
! 322: /* Find the hash node that corresponds the ether address 'ep' */
! 323:
! 324: static inline struct enamemem *
! 325: lookup_emem(const u_char *ep)
! 326: {
! 327: register u_int i, j, k;
! 328: struct enamemem *tp;
! 329:
! 330: k = (ep[0] << 8) | ep[1];
! 331: j = (ep[2] << 8) | ep[3];
! 332: i = (ep[4] << 8) | ep[5];
! 333:
! 334: tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)];
! 335: while (tp->e_nxt)
! 336: if (tp->e_addr0 == i &&
! 337: tp->e_addr1 == j &&
! 338: tp->e_addr2 == k)
! 339: return tp;
! 340: else
! 341: tp = tp->e_nxt;
! 342: tp->e_addr0 = i;
! 343: tp->e_addr1 = j;
! 344: tp->e_addr2 = k;
! 345: tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
! 346: if (tp->e_nxt == NULL)
! 347: error("lookup_emem: calloc");
! 348:
! 349: return tp;
! 350: }
! 351:
! 352: /*
! 353: * Find the hash node that corresponds to the bytestring 'bs'
! 354: * with length 'nlen'
! 355: */
! 356:
! 357: static inline struct enamemem *
! 358: lookup_bytestring(register const u_char *bs, const unsigned int nlen)
! 359: {
! 360: struct enamemem *tp;
! 361: register u_int i, j, k;
! 362:
! 363: if (nlen >= 6) {
! 364: k = (bs[0] << 8) | bs[1];
! 365: j = (bs[2] << 8) | bs[3];
! 366: i = (bs[4] << 8) | bs[5];
! 367: } else if (nlen >= 4) {
! 368: k = (bs[0] << 8) | bs[1];
! 369: j = (bs[2] << 8) | bs[3];
! 370: i = 0;
! 371: } else
! 372: i = j = k = 0;
! 373:
! 374: tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)];
! 375: while (tp->e_nxt)
! 376: if (tp->e_addr0 == i &&
! 377: tp->e_addr1 == j &&
! 378: tp->e_addr2 == k &&
! 379: memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0)
! 380: return tp;
! 381: else
! 382: tp = tp->e_nxt;
! 383:
! 384: tp->e_addr0 = i;
! 385: tp->e_addr1 = j;
! 386: tp->e_addr2 = k;
! 387:
! 388: tp->e_bs = (u_char *) calloc(1, nlen + 1);
! 389: memcpy(tp->e_bs, bs, nlen);
! 390: tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
! 391: if (tp->e_nxt == NULL)
! 392: error("lookup_bytestring: calloc");
! 393:
! 394: return tp;
! 395: }
! 396:
! 397: /* Find the hash node that corresponds the NSAP 'nsap' */
! 398:
! 399: static inline struct enamemem *
! 400: lookup_nsap(register const u_char *nsap)
! 401: {
! 402: register u_int i, j, k;
! 403: unsigned int nlen = *nsap;
! 404: struct enamemem *tp;
! 405: const u_char *ensap = nsap + nlen - 6;
! 406:
! 407: if (nlen > 6) {
! 408: k = (ensap[0] << 8) | ensap[1];
! 409: j = (ensap[2] << 8) | ensap[3];
! 410: i = (ensap[4] << 8) | ensap[5];
! 411: }
! 412: else
! 413: i = j = k = 0;
! 414:
! 415: tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)];
! 416: while (tp->e_nxt)
! 417: if (tp->e_addr0 == i &&
! 418: tp->e_addr1 == j &&
! 419: tp->e_addr2 == k &&
! 420: tp->e_nsap[0] == nlen &&
! 421: memcmp((const char *)&(nsap[1]),
! 422: (char *)&(tp->e_nsap[1]), nlen) == 0)
! 423: return tp;
! 424: else
! 425: tp = tp->e_nxt;
! 426: tp->e_addr0 = i;
! 427: tp->e_addr1 = j;
! 428: tp->e_addr2 = k;
! 429: tp->e_nsap = (u_char *)malloc(nlen + 1);
! 430: if (tp->e_nsap == NULL)
! 431: error("lookup_nsap: malloc");
! 432: memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1);
! 433: tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
! 434: if (tp->e_nxt == NULL)
! 435: error("lookup_nsap: calloc");
! 436:
! 437: return tp;
! 438: }
! 439:
! 440: /* Find the hash node that corresponds the protoid 'pi'. */
! 441:
! 442: static inline struct protoidmem *
! 443: lookup_protoid(const u_char *pi)
! 444: {
! 445: register u_int i, j;
! 446: struct protoidmem *tp;
! 447:
! 448: /* 5 octets won't be aligned */
! 449: i = (((pi[0] << 8) + pi[1]) << 8) + pi[2];
! 450: j = (pi[3] << 8) + pi[4];
! 451: /* XXX should be endian-insensitive, but do big-endian testing XXX */
! 452:
! 453: tp = &protoidtable[(i ^ j) & (HASHNAMESIZE-1)];
! 454: while (tp->p_nxt)
! 455: if (tp->p_oui == i && tp->p_proto == j)
! 456: return tp;
! 457: else
! 458: tp = tp->p_nxt;
! 459: tp->p_oui = i;
! 460: tp->p_proto = j;
! 461: tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
! 462: if (tp->p_nxt == NULL)
! 463: error("lookup_protoid: calloc");
! 464:
! 465: return tp;
! 466: }
! 467:
! 468: const char *
! 469: etheraddr_string(register const u_char *ep)
! 470: {
! 471: register u_int i;
! 472: register char *cp;
! 473: register struct enamemem *tp;
! 474: char buf[sizeof("00:00:00:00:00:00")];
! 475:
! 476: tp = lookup_emem(ep);
! 477: if (tp->e_name)
! 478: return (tp->e_name);
! 479: #ifdef USE_ETHER_NTOHOST
! 480: if (!nflag) {
! 481: char buf2[128];
! 482: if (ether_ntohost(buf2, (const struct ether_addr *)ep) == 0) {
! 483: tp->e_name = strdup(buf2);
! 484: return (tp->e_name);
! 485: }
! 486: }
! 487: #endif
! 488: cp = buf;
! 489: *cp++ = hex[*ep >> 4 ];
! 490: *cp++ = hex[*ep++ & 0xf];
! 491: for (i = 5; (int)--i >= 0;) {
! 492: *cp++ = ':';
! 493: *cp++ = hex[*ep >> 4 ];
! 494: *cp++ = hex[*ep++ & 0xf];
! 495: }
! 496: *cp = '\0';
! 497: tp->e_name = strdup(buf);
! 498: return (tp->e_name);
! 499: }
! 500:
! 501: const char *
! 502: linkaddr_string(const u_char *ep, const unsigned int len)
! 503: {
! 504: register u_int i, j;
! 505: register char *cp;
! 506: register struct enamemem *tp;
! 507:
! 508: if (!ep || len < 1) return "";
! 509:
! 510: #ifdef notdef
! 511: if (len == 6) /* XXX not totally correct... */
! 512: return etheraddr_string(ep);
! 513: #endif
! 514:
! 515: tp = lookup_bytestring(ep, len);
! 516: if (tp->e_name)
! 517: return (tp->e_name);
! 518:
! 519: tp->e_name = cp = (char *)malloc(len*3);
! 520: if (tp->e_name == NULL)
! 521: error("linkaddr_string: malloc");
! 522: if ((j = *ep >> 4) != 0)
! 523: *cp++ = hex[j];
! 524: *cp++ = hex[*ep++ & 0xf];
! 525: for (i = len-1; i > 0 ; --i) {
! 526: *cp++ = ':';
! 527: if ((j = *ep >> 4) != 0)
! 528: *cp++ = hex[j];
! 529: *cp++ = hex[*ep++ & 0xf];
! 530: }
! 531: *cp = '\0';
! 532: return (tp->e_name);
! 533: }
! 534:
! 535: const char *
! 536: ethertype_string(u_short type)
! 537: {
! 538: register char *cp;
! 539: register struct hnamemem *tp;
! 540: register u_int32_t i = type;
! 541: char buf[sizeof("0000")];
! 542:
! 543: for (tp = &etypetable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 544: if (tp->addr == i)
! 545: return (tp->name);
! 546:
! 547: tp->addr = i;
! 548: tp->nxt = newhnamemem();
! 549:
! 550: cp = buf;
! 551: NTOHS(type);
! 552: *cp++ = toupper(hex[type >> 12 & 0xf]);
! 553: *cp++ = toupper(hex[type >> 8 & 0xf]);
! 554: *cp++ = toupper(hex[type >> 4 & 0xf]);
! 555: *cp++ = toupper(hex[type & 0xf]);
! 556: *cp++ = '\0';
! 557: tp->name = strdup(buf);
! 558: return (tp->name);
! 559: }
! 560:
! 561: const char *
! 562: protoid_string(register const u_char *pi)
! 563: {
! 564: register u_int i, j;
! 565: register char *cp;
! 566: register struct protoidmem *tp;
! 567: char buf[sizeof("00:00:00:00:00")];
! 568:
! 569: tp = lookup_protoid(pi);
! 570: if (tp->p_name)
! 571: return tp->p_name;
! 572:
! 573: cp = buf;
! 574: if ((j = *pi >> 4) != 0)
! 575: *cp++ = hex[j];
! 576: *cp++ = hex[*pi++ & 0xf];
! 577: for (i = 4; (int)--i >= 0;) {
! 578: *cp++ = ':';
! 579: if ((j = *pi >> 4) != 0)
! 580: *cp++ = hex[j];
! 581: *cp++ = hex[*pi++ & 0xf];
! 582: }
! 583: *cp = '\0';
! 584: tp->p_name = strdup(buf);
! 585: return (tp->p_name);
! 586: }
! 587:
! 588: const char *
! 589: llcsap_string(u_char sap)
! 590: {
! 591: register struct hnamemem *tp;
! 592: register u_int32_t i = sap;
! 593: char buf[sizeof("sap-00")];
! 594:
! 595: for (tp = &llcsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 596: if (tp->addr == i)
! 597: return (tp->name);
! 598:
! 599: tp->addr = i;
! 600: tp->nxt = newhnamemem();
! 601:
! 602: snprintf(buf, sizeof(buf), "sap-%02x", sap & 0xff);
! 603: tp->name = strdup(buf);
! 604: return (tp->name);
! 605: }
! 606:
! 607: const char *
! 608: isonsap_string(const u_char *nsap)
! 609: {
! 610: register u_int i, nlen = nsap[0];
! 611: register char *cp;
! 612: register struct enamemem *tp;
! 613:
! 614: tp = lookup_nsap(nsap);
! 615: if (tp->e_name)
! 616: return tp->e_name;
! 617:
! 618: tp->e_name = cp = (char *)malloc(nlen * 2 + 2);
! 619: if (cp == NULL)
! 620: error("isonsap_string: malloc");
! 621:
! 622: nsap++;
! 623: *cp++ = '/';
! 624: for (i = nlen; (int)--i >= 0;) {
! 625: *cp++ = hex[*nsap >> 4];
! 626: *cp++ = hex[*nsap++ & 0xf];
! 627: }
! 628: *cp = '\0';
! 629: return (tp->e_name);
! 630: }
! 631:
! 632: const char *
! 633: tcpport_string(u_short port)
! 634: {
! 635: register struct hnamemem *tp;
! 636: register u_int32_t i = port;
! 637: char buf[sizeof("00000")];
! 638:
! 639: for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
! 640: if (tp->addr == i)
! 641: return (tp->name);
! 642: }
! 643: tp->addr = i;
! 644: tp->nxt = newhnamemem();
! 645:
! 646: (void)snprintf(buf, sizeof(buf), "%u", i);
! 647: tp->name = strdup(buf);
! 648: return (tp->name);
! 649: }
! 650:
! 651: const char *
! 652: udpport_string(u_short port)
! 653: {
! 654: register struct hnamemem *tp;
! 655: register u_int32_t i = port;
! 656: char buf[sizeof("00000")];
! 657:
! 658: for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
! 659: if (tp->addr == i)
! 660: return (tp->name);
! 661: }
! 662: tp->addr = i;
! 663: tp->nxt = newhnamemem();
! 664:
! 665: (void)snprintf(buf, sizeof(buf), "%u", i);
! 666: tp->name = strdup(buf);
! 667: return (tp->name);
! 668: }
! 669:
! 670: int
! 671: isservport(u_short port)
! 672: {
! 673: register struct hnamemem *tp;
! 674: register u_int32_t i = port;
! 675:
! 676: for (tp = &servtable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) {
! 677: if (tp->addr == i)
! 678: return 1;
! 679: }
! 680: return 0;
! 681: }
! 682:
! 683: const char *
! 684: ipxsap_string(u_short port)
! 685: {
! 686: register char *cp;
! 687: register struct hnamemem *tp;
! 688: register u_int32_t i = port;
! 689: char buf[sizeof("0000")];
! 690:
! 691: for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 692: if (tp->addr == i)
! 693: return (tp->name);
! 694:
! 695: tp->addr = i;
! 696: tp->nxt = newhnamemem();
! 697:
! 698: cp = buf;
! 699: NTOHS(port);
! 700: *cp++ = toupper(hex[port >> 12 & 0xf]);
! 701: *cp++ = toupper(hex[port >> 8 & 0xf]);
! 702: *cp++ = toupper(hex[port >> 4 & 0xf]);
! 703: *cp++ = toupper(hex[port & 0xf]);
! 704: *cp++ = '\0';
! 705: tp->name = strdup(buf);
! 706: return (tp->name);
! 707: }
! 708:
! 709: static void
! 710: init_servarray(void)
! 711: {
! 712: struct servent *sv;
! 713: register struct hnamemem *table;
! 714: register int i;
! 715:
! 716: while ((sv = getservent()) != NULL) {
! 717: int port = ntohs(sv->s_port);
! 718: i = port & (HASHNAMESIZE-1);
! 719:
! 720: table = &servtable[i];
! 721: if (table->addr != port) {
! 722: while (table->addr)
! 723: table = table->nxt;
! 724: table->addr = port;
! 725: table->nxt = newhnamemem();
! 726: }
! 727:
! 728: if (strcmp(sv->s_proto, "tcp") == 0)
! 729: table = &tporttable[i];
! 730: else if (strcmp(sv->s_proto, "udp") == 0)
! 731: table = &uporttable[i];
! 732: else continue;
! 733:
! 734: while (table->name)
! 735: table = table->nxt;
! 736: table->name = strdup(sv->s_name);
! 737: table->addr = port;
! 738: table->nxt = newhnamemem();
! 739: }
! 740: endservent();
! 741: }
! 742:
! 743: static struct tok ethertype_db[] = {
! 744: { ETHERTYPE_IP, "ip" },
! 745: { ETHERTYPE_MPLS, "mpls" },
! 746: { ETHERTYPE_MPLS_MULTI, "mpls-mc" },
! 747: { ETHERTYPE_IPV6, "ipv6" },
! 748: { ETHERTYPE_8021Q, "dot1q" },
! 749: { ETHERTYPE_VMAN, "vman" },
! 750: { ETHERTYPE_PUP, "pup" },
! 751: { ETHERTYPE_ARP, "arp" },
! 752: { ETHERTYPE_REVARP , "rarp" },
! 753: { ETHERTYPE_NS, "ns" },
! 754: { ETHERTYPE_SPRITE, "sprite" },
! 755: { ETHERTYPE_TRAIL, "trail" },
! 756: { ETHERTYPE_CDP, "cdp" },
! 757: { ETHERTYPE_MOPDL, "mop-dl" },
! 758: { ETHERTYPE_MOPRC, "mop-rc" },
! 759: { ETHERTYPE_DN, "dn" },
! 760: { ETHERTYPE_LAT, "lat" },
! 761: { ETHERTYPE_SCA, "sca" },
! 762: { ETHERTYPE_LANBRIDGE, "lanbridge" },
! 763: { ETHERTYPE_DECDNS, "dec-dns" },
! 764: { ETHERTYPE_DECDTS, "dec-dts" },
! 765: { ETHERTYPE_VEXP, "vexp" },
! 766: { ETHERTYPE_VPROD, "vprod" },
! 767: { ETHERTYPE_ATALK, "atalk" },
! 768: { ETHERTYPE_AARP, "atalk-arp" },
! 769: { ETHERTYPE_IPX, "ipx" },
! 770: { ETHERTYPE_PPP, "ppp" },
! 771: { ETHERTYPE_PPPOED, "pppoe-d" },
! 772: { ETHERTYPE_PPPOES, "pppoe-s" },
! 773: { ETHERTYPE_LOOPBACK, "loopback" },
! 774: { 0, NULL }
! 775: };
! 776:
! 777: static void
! 778: init_etypearray(void)
! 779: {
! 780: register int i;
! 781: register struct hnamemem *table;
! 782:
! 783: for (i = 0; ethertype_db[i].s; i++) {
! 784: int j = htons(ethertype_db[i].v) & (HASHNAMESIZE-1);
! 785: table = &etypetable[j];
! 786: while (table->name)
! 787: table = table->nxt;
! 788: table->name = ethertype_db[i].s;
! 789: table->addr = htons(ethertype_db[i].v);
! 790: table->nxt = newhnamemem();
! 791: }
! 792: }
! 793:
! 794: static struct protoidlist {
! 795: const u_char protoid[5];
! 796: const char *name;
! 797: } protoidlist[] = {
! 798: {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" },
! 799: {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" },
! 800: {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" },
! 801: {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" },
! 802: {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" },
! 803: {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
! 804: };
! 805:
! 806: /*
! 807: * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet
! 808: * types.
! 809: */
! 810: static void
! 811: init_protoidarray(void)
! 812: {
! 813: register int i;
! 814: register struct protoidmem *tp;
! 815: struct protoidlist *pl;
! 816: u_char protoid[5];
! 817:
! 818: protoid[0] = 0;
! 819: protoid[1] = 0;
! 820: protoid[2] = 0;
! 821: for (i = 0; ethertype_db[i].s; i++) {
! 822: u_short etype = htons(ethertype_db[i].v);
! 823:
! 824: memcpy((char *)&protoid[3], (char *)&etype, 2);
! 825: tp = lookup_protoid(protoid);
! 826: tp->p_name = strdup(ethertype_db[i].s);
! 827: }
! 828: /* Hardwire some SNAP proto ID names */
! 829: for (pl = protoidlist; pl->name != NULL; ++pl) {
! 830: tp = lookup_protoid(pl->protoid);
! 831: /* Don't override existing name */
! 832: if (tp->p_name != NULL)
! 833: continue;
! 834:
! 835: tp->p_name = pl->name;
! 836: }
! 837: }
! 838:
! 839: static struct etherlist {
! 840: const u_char addr[6];
! 841: const char *name;
! 842: } etherlist[] = {
! 843: {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, "ethernet" },
! 844: {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "broadcast" },
! 845: {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
! 846: };
! 847:
! 848: /*
! 849: * Initialize the ethers hash table. We take two different approaches
! 850: * depending on whether or not the system provides the ethers name
! 851: * service. If it does, we just wire in a few names at startup,
! 852: * and etheraddr_string() fills in the table on demand. If it doesn't,
! 853: * then we suck in the entire /etc/ethers file at startup. The idea
! 854: * is that parsing the local file will be fast, but spinning through
! 855: * all the ethers entries via NIS & next_etherent might be very slow.
! 856: *
! 857: * XXX pcap_next_etherent doesn't belong in the pcap interface, but
! 858: * since the pcap module already does name-to-address translation,
! 859: * it's already does most of the work for the ethernet address-to-name
! 860: * translation, so we just pcap_next_etherent as a convenience.
! 861: */
! 862: static void
! 863: init_etherarray(void)
! 864: {
! 865: register struct etherlist *el;
! 866: register struct enamemem *tp;
! 867: #ifdef USE_ETHER_NTOHOST
! 868: char name[256];
! 869: #else
! 870: register struct pcap_etherent *ep;
! 871: register FILE *fp;
! 872:
! 873: /* Suck in entire ethers file */
! 874: fp = fopen(PCAP_ETHERS_FILE, "r");
! 875: if (fp != NULL) {
! 876: while ((ep = pcap_next_etherent(fp)) != NULL) {
! 877: tp = lookup_emem(ep->addr);
! 878: tp->e_name = strdup(ep->name);
! 879: }
! 880: (void)fclose(fp);
! 881: }
! 882: #endif
! 883:
! 884: /* Hardwire some ethernet names */
! 885: for (el = etherlist; el->name != NULL; ++el) {
! 886: tp = lookup_emem(el->addr);
! 887: /* Don't override existing name */
! 888: if (tp->e_name != NULL)
! 889: continue;
! 890:
! 891: #ifdef USE_ETHER_NTOHOST
! 892: /* Use yp/nis version of name if available */
! 893: if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) {
! 894: tp->e_name = strdup(name);
! 895: continue;
! 896: }
! 897: #endif
! 898: tp->e_name = el->name;
! 899: }
! 900: }
! 901:
! 902: static struct tok llcsap_db[] = {
! 903: /* IEEE SAPs */
! 904: { 0x00, "null" },
! 905: { 0x02, "isap" },
! 906: { 0x03, "gsap" },
! 907: { 0x06, "ip-sap" },
! 908: { 0x0e, "proway-nm" },
! 909: { 0x42, "stp" },
! 910: { 0x4e, "rs511" },
! 911: { 0x5e, "isi-ip" },
! 912: { 0x7e, "x25-plp" },
! 913: { 0x80, "3com" },
! 914: { 0x8e, "proway" },
! 915: { 0xaa, "snap" },
! 916: { 0xbc, "banyan" },
! 917: { 0xe0, "ipx" },
! 918: { 0xf0, "netbeui" },
! 919: { 0xf4, "lanman" },
! 920: { 0xfe, "iso-clns" },
! 921: { 0xff, "raw-ipx" }, /* known as raw 802.3 packet */
! 922: /* IBM SAPs */
! 923: { 0x04, "isna" },
! 924: { 0x05, "gsna" },
! 925: { 0xd4, "resource" },
! 926: { 0xdc, "dyn-arp" },
! 927: { 0xf0, "netbios" },
! 928: { 0xf8, "irpl" },
! 929: { 0xf4, "ilan" },
! 930: { 0xf5, "glan" },
! 931: { 0xfc, "discovery" },
! 932: { 0, NULL }
! 933: };
! 934:
! 935: static void
! 936: init_llcsaparray(void)
! 937: {
! 938: register int i;
! 939: register struct hnamemem *table;
! 940:
! 941: for (i = 0; llcsap_db[i].s != NULL; i++) {
! 942: table = &llcsaptable[llcsap_db[i].v];
! 943: while (table->name)
! 944: table = table->nxt;
! 945: table->name = llcsap_db[i].s;
! 946: table->addr = llcsap_db[i].v;
! 947: table->nxt = newhnamemem();
! 948: }
! 949: }
! 950:
! 951: static struct tok ipxsap_db[] = {
! 952: { 0x0000, "Unknown" },
! 953: { 0x0001, "User" },
! 954: { 0x0002, "User Group" },
! 955: { 0x0003, "PrintQueue" },
! 956: { 0x0004, "FileServer" },
! 957: { 0x0005, "JobServer" },
! 958: { 0x0006, "Gateway" },
! 959: { 0x0007, "PrintServer" },
! 960: { 0x0008, "ArchiveQueue" },
! 961: { 0x0009, "ArchiveServer" },
! 962: { 0x000a, "JobQueue" },
! 963: { 0x000b, "Administration" },
! 964: { 0x000F, "Novell TI-RPC" },
! 965: { 0x0017, "Diagnostics" },
! 966: { 0x0020, "NetBIOS" },
! 967: { 0x0021, "NAS SNA Gateway" },
! 968: { 0x0023, "NACS AsyncGateway" },
! 969: { 0x0024, "RemoteBridge/RoutingService" },
! 970: { 0x0026, "BridgeServer" },
! 971: { 0x0027, "TCP/IP Gateway" },
! 972: { 0x0028, "Point-to-point X.25 BridgeServer" },
! 973: { 0x0029, "3270 Gateway" },
! 974: { 0x002a, "CHI Corp" },
! 975: { 0x002c, "PC Chalkboard" },
! 976: { 0x002d, "TimeSynchServer" },
! 977: { 0x002e, "ARCserve5.0/PalindromeBackup" },
! 978: { 0x0045, "DI3270 Gateway" },
! 979: { 0x0047, "AdvertisingPrintServer" },
! 980: { 0x004a, "NetBlazerModems" },
! 981: { 0x004b, "BtrieveVAP" },
! 982: { 0x004c, "NetwareSQL" },
! 983: { 0x004d, "XtreeNetwork" },
! 984: { 0x0050, "BtrieveVAP4.11" },
! 985: { 0x0052, "QuickLink" },
! 986: { 0x0053, "PrintQueueUser" },
! 987: { 0x0058, "Multipoint X.25 Router" },
! 988: { 0x0060, "STLB/NLM" },
! 989: { 0x0064, "ARCserve" },
! 990: { 0x0066, "ARCserve3.0" },
! 991: { 0x0072, "WAN CopyUtility" },
! 992: { 0x007a, "TES-NetwareVMS" },
! 993: { 0x0092, "WATCOM Debugger/EmeraldTapeBackupServer" },
! 994: { 0x0095, "DDA OBGYN" },
! 995: { 0x0098, "NetwareAccessServer" },
! 996: { 0x009a, "Netware for VMS II/NamedPipeServer" },
! 997: { 0x009b, "NetwareAccessServer" },
! 998: { 0x009e, "PortableNetwareServer/SunLinkNVT" },
! 999: { 0x00a1, "PowerchuteAPC UPS" },
! 1000: { 0x00aa, "LAWserve" },
! 1001: { 0x00ac, "CompaqIDA StatusMonitor" },
! 1002: { 0x0100, "PIPE STAIL" },
! 1003: { 0x0102, "LAN ProtectBindery" },
! 1004: { 0x0103, "OracleDataBaseServer" },
! 1005: { 0x0107, "Netware386/RSPX RemoteConsole" },
! 1006: { 0x010f, "NovellSNA Gateway" },
! 1007: { 0x0111, "TestServer" },
! 1008: { 0x0112, "HP PrintServer" },
! 1009: { 0x0114, "CSA MUX" },
! 1010: { 0x0115, "CSA LCA" },
! 1011: { 0x0116, "CSA CM" },
! 1012: { 0x0117, "CSA SMA" },
! 1013: { 0x0118, "CSA DBA" },
! 1014: { 0x0119, "CSA NMA" },
! 1015: { 0x011a, "CSA SSA" },
! 1016: { 0x011b, "CSA STATUS" },
! 1017: { 0x011e, "CSA APPC" },
! 1018: { 0x0126, "SNA TEST SSA Profile" },
! 1019: { 0x012a, "CSA TRACE" },
! 1020: { 0x012b, "NetwareSAA" },
! 1021: { 0x012e, "IKARUS VirusScan" },
! 1022: { 0x0130, "CommunicationsExecutive" },
! 1023: { 0x0133, "NNS DomainServer/NetwareNamingServicesDomain" },
! 1024: { 0x0135, "NetwareNamingServicesProfile" },
! 1025: { 0x0137, "Netware386 PrintQueue/NNS PrintQueue" },
! 1026: { 0x0141, "LAN SpoolServer" },
! 1027: { 0x0152, "IRMALAN Gateway" },
! 1028: { 0x0154, "NamedPipeServer" },
! 1029: { 0x0166, "NetWareManagement" },
! 1030: { 0x0168, "Intel PICKIT CommServer/Intel CAS TalkServer" },
! 1031: { 0x0173, "Compaq" },
! 1032: { 0x0174, "Compaq SNMP Agent" },
! 1033: { 0x0175, "Compaq" },
! 1034: { 0x0180, "XTreeServer/XTreeTools" },
! 1035: { 0x018A, "NASI ServicesBroadcastServer" },
! 1036: { 0x01b0, "GARP Gateway" },
! 1037: { 0x01b1, "Binfview" },
! 1038: { 0x01bf, "IntelLanDeskManager" },
! 1039: { 0x01ca, "AXTEC" },
! 1040: { 0x01cb, "ShivaNetModem/E" },
! 1041: { 0x01cc, "ShivaLanRover/E" },
! 1042: { 0x01cd, "ShivaLanRover/T" },
! 1043: { 0x01ce, "ShivaUniversal" },
! 1044: { 0x01d8, "CastelleFAXPressServer" },
! 1045: { 0x01da, "CastelleLANPressPrintServer" },
! 1046: { 0x01dc, "CastelleFAX/Xerox7033 FaxServer/ExcelLanFax" },
! 1047: { 0x01f0, "LEGATO" },
! 1048: { 0x01f5, "LEGATO" },
! 1049: { 0x0233, "NMS Agent/NetwareManagementAgent" },
! 1050: { 0x0237, "NMS IPX Discovery/LANternReadWriteChannel" },
! 1051: { 0x0238, "NMS IP Discovery/LANternTrapAlarmChannel" },
! 1052: { 0x023a, "LANtern" },
! 1053: { 0x023c, "MAVERICK" },
! 1054: { 0x023f, "NovellSMDR" },
! 1055: { 0x024e, "NetwareConnect" },
! 1056: { 0x024f, "NASI ServerBroadcast Cisco" },
! 1057: { 0x026a, "NMS ServiceConsole" },
! 1058: { 0x026b, "TimeSynchronizationServer Netware 4.x" },
! 1059: { 0x0278, "DirectoryServer Netware 4.x" },
! 1060: { 0x027b, "NetwareManagementAgent" },
! 1061: { 0x0280, "Novell File and Printer Sharing Service for PC" },
! 1062: { 0x0304, "NovellSAA Gateway" },
! 1063: { 0x0308, "COM/VERMED" },
! 1064: { 0x030a, "GalacticommWorldgroupServer" },
! 1065: { 0x030c, "IntelNetport2/HP JetDirect/HP Quicksilver" },
! 1066: { 0x0320, "AttachmateGateway" },
! 1067: { 0x0327, "MicrosoftDiagnostiocs" },
! 1068: { 0x0328, "WATCOM SQL Server" },
! 1069: { 0x0335, "MultiTechSystems MultisynchCommServer" },
! 1070: { 0x0343, "Xylogics RemoteAccessServer/LANModem" },
! 1071: { 0x0355, "ArcadaBackupExec" },
! 1072: { 0x0358, "MSLCD1" },
! 1073: { 0x0361, "NETINELO" },
! 1074: { 0x037e, "Powerchute UPS Monitoring" },
! 1075: { 0x037f, "ViruSafeNotify" },
! 1076: { 0x0386, "HP Bridge" },
! 1077: { 0x0387, "HP Hub" },
! 1078: { 0x0394, "NetWare SAA Gateway" },
! 1079: { 0x039b, "LotusNotes" },
! 1080: { 0x03b7, "CertusAntiVirus" },
! 1081: { 0x03c4, "ARCserve4.0" },
! 1082: { 0x03c7, "LANspool3.5" },
! 1083: { 0x03d7, "LexmarkPrinterServer" },
! 1084: { 0x03d8, "LexmarkXLE PrinterServer" },
! 1085: { 0x03dd, "BanyanENS NetwareClient" },
! 1086: { 0x03de, "GuptaSequelBaseServer/NetWareSQL" },
! 1087: { 0x03e1, "UnivelUnixware" },
! 1088: { 0x03e4, "UnivelUnixware" },
! 1089: { 0x03fc, "IntelNetport" },
! 1090: { 0x03fd, "PrintServerQueue" },
! 1091: { 0x040A, "ipnServer" },
! 1092: { 0x040D, "LVERRMAN" },
! 1093: { 0x040E, "LVLIC" },
! 1094: { 0x0414, "NET Silicon (DPI)/Kyocera" },
! 1095: { 0x0429, "SiteLockVirus" },
! 1096: { 0x0432, "UFHELPR???" },
! 1097: { 0x0433, "Synoptics281xAdvancedSNMPAgent" },
! 1098: { 0x0444, "MicrosoftNT SNA Server" },
! 1099: { 0x0448, "Oracle" },
! 1100: { 0x044c, "ARCserve5.01" },
! 1101: { 0x0457, "CanonGP55" },
! 1102: { 0x045a, "QMS Printers" },
! 1103: { 0x045b, "DellSCSI Array" },
! 1104: { 0x0491, "NetBlazerModems" },
! 1105: { 0x04ac, "OnTimeScheduler" },
! 1106: { 0x04b0, "CD-Net" },
! 1107: { 0x0513, "EmulexNQA" },
! 1108: { 0x0520, "SiteLockChecks" },
! 1109: { 0x0529, "SiteLockChecks" },
! 1110: { 0x052d, "CitrixOS2 AppServer" },
! 1111: { 0x0535, "Tektronix" },
! 1112: { 0x0536, "Milan" },
! 1113: { 0x055d, "Attachmate SNA gateway" },
! 1114: { 0x056b, "IBM8235 ModemServer" },
! 1115: { 0x056c, "ShivaLanRover/E PLUS" },
! 1116: { 0x056d, "ShivaLanRover/T PLUS" },
! 1117: { 0x0580, "McAfeeNetShield" },
! 1118: { 0x05B8, "NLM to workstation communication (Revelation Software)" },
! 1119: { 0x05BA, "CompatibleSystemsRouters" },
! 1120: { 0x05BE, "CheyenneHierarchicalStorageManager" },
! 1121: { 0x0606, "JCWatermarkImaging" },
! 1122: { 0x060c, "AXISNetworkPrinter" },
! 1123: { 0x0610, "AdaptecSCSIManagement" },
! 1124: { 0x0621, "IBM AntiVirus" },
! 1125: { 0x0640, "Windows95 RemoteRegistryService" },
! 1126: { 0x064e, "MicrosoftIIS" },
! 1127: { 0x067b, "Microsoft Win95/98 File and Print Sharing for NetWare" },
! 1128: { 0x067c, "Microsoft Win95/98 File and Print Sharing for NetWare" },
! 1129: { 0x076C, "Xerox" },
! 1130: { 0x079b, "ShivaLanRover/E 115" },
! 1131: { 0x079c, "ShivaLanRover/T 115" },
! 1132: { 0x07B4, "CubixWorldDesk" },
! 1133: { 0x07c2, "Quarterdeck IWare Connect V2.x NLM" },
! 1134: { 0x07c1, "Quarterdeck IWare Connect V3.x NLM" },
! 1135: { 0x0810, "ELAN License Server Demo" },
! 1136: { 0x0824, "ShivaLanRoverAccessSwitch/E" },
! 1137: { 0x086a, "ISSC Collector" },
! 1138: { 0x087f, "ISSC DAS AgentAIX" },
! 1139: { 0x0880, "Intel Netport PRO" },
! 1140: { 0x0881, "Intel Netport PRO" },
! 1141: { 0x0b29, "SiteLock" },
! 1142: { 0x0c29, "SiteLockApplications" },
! 1143: { 0x0c2c, "LicensingServer" },
! 1144: { 0x2101, "PerformanceTechnologyInstantInternet" },
! 1145: { 0x2380, "LAI SiteLock" },
! 1146: { 0x238c, "MeetingMaker" },
! 1147: { 0x4808, "SiteLockServer/SiteLockMetering" },
! 1148: { 0x5555, "SiteLockUser" },
! 1149: { 0x6312, "Tapeware" },
! 1150: { 0x6f00, "RabbitGateway" },
! 1151: { 0x7703, "MODEM" },
! 1152: { 0x8002, "NetPortPrinters" },
! 1153: { 0x8008, "WordPerfectNetworkVersion" },
! 1154: { 0x85BE, "Cisco EIGRP" },
! 1155: { 0x8888, "WordPerfectNetworkVersion/QuickNetworkManagement" },
! 1156: { 0x9000, "McAfeeNetShield" },
! 1157: { 0x9604, "CSA-NT_MON" },
! 1158: { 0xb6a8, "OceanIsleReachoutRemoteControl" },
! 1159: { 0xf11f, "SiteLockMetering" },
! 1160: { 0xf1ff, "SiteLock" },
! 1161: { 0xf503, "Microsoft SQL Server" },
! 1162: { 0xF905, "IBM TimeAndPlace" },
! 1163: { 0xfbfb, "TopCallIII FaxServer" },
! 1164: { 0xffff, "AnyService/Wildcard" },
! 1165: { 0, (char *)0 }
! 1166: };
! 1167:
! 1168: static void
! 1169: init_ipxsaparray(void)
! 1170: {
! 1171: register int i;
! 1172: register struct hnamemem *table;
! 1173:
! 1174: for (i = 0; ipxsap_db[i].s != NULL; i++) {
! 1175: int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1);
! 1176: table = &ipxsaptable[j];
! 1177: while (table->name)
! 1178: table = table->nxt;
! 1179: table->name = ipxsap_db[i].s;
! 1180: table->addr = htons(ipxsap_db[i].v);
! 1181: table->nxt = newhnamemem();
! 1182: }
! 1183: }
! 1184:
! 1185: const char *
! 1186: ipproto_string(u_char proto)
! 1187: {
! 1188: register struct hnamemem *tp;
! 1189: register u_int32_t i = proto;
! 1190: char buf[sizeof("00000")];
! 1191:
! 1192: for (tp = &iprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 1193: if (tp->addr == i)
! 1194: return (tp->name);
! 1195:
! 1196: tp->addr = i;
! 1197: tp->nxt = newhnamemem();
! 1198:
! 1199: (void)snprintf(buf, sizeof(buf), "%u", i);
! 1200: tp->name = strdup(buf);
! 1201: return (tp->name);
! 1202: }
! 1203:
! 1204: static void
! 1205: init_iprotoarray(void)
! 1206: {
! 1207: struct protoent *pe;
! 1208: register struct hnamemem *tp;
! 1209: register u_int32_t i;
! 1210:
! 1211: while ((pe = getprotoent()) != NULL) {
! 1212: i = pe->p_proto;
! 1213: for (tp = &iprototable[i & (HASHNAMESIZE-1)];
! 1214: tp->name; tp = tp->nxt) ;
! 1215:
! 1216: tp->name = strdup(pe->p_name);
! 1217: tp->addr = i;
! 1218: tp->nxt = newhnamemem();
! 1219: }
! 1220: endprotoent();
! 1221: }
! 1222:
! 1223: static struct tok icmp_db[] = {
! 1224: { 0x0000, "echo-reply" },
! 1225: { 0x0300, "unrch-net" },
! 1226: { 0x0301, "unrch-host" },
! 1227: { 0x0302, "unrch-proto" },
! 1228: { 0x0303, "unrch-port" },
! 1229: { 0x0304, "need-frag" },
! 1230: { 0x0305, "src-fail" },
! 1231: { 0x0306, "bad-net" },
! 1232: { 0x0307, "bad-host" },
! 1233: { 0x0308, "isolated" },
! 1234: { 0x0309, "net-prhbt" },
! 1235: { 0x030a, "host-prhbt" },
! 1236: { 0x030b, "bad-ntos" },
! 1237: { 0x030c, "bad-htos" },
! 1238: { 0x030d, "filtered" },
! 1239: { 0x030e, "no-prec" },
! 1240: { 0x030f, "prec-cut" },
! 1241: { 0x0400, "quench" },
! 1242: { 0x0500, "redir-net" },
! 1243: { 0x0501, "redir-hst" },
! 1244: { 0x0502, "redir-ntos" },
! 1245: { 0x0503, "redir-htos" },
! 1246: { 0x0800, "echo-reqst" },
! 1247: { 0x0900, "advert" },
! 1248: { 0x0a00, "solicit" },
! 1249: { 0x0b00, "ttl-exceed" },
! 1250: { 0x0b01, "frg-exceed" },
! 1251: { 0x0c00, "err-atptr" },
! 1252: { 0x0c01, "optabsent" },
! 1253: { 0x0c02, "bad-len" },
! 1254: { 0x0d00, "time-reqst" },
! 1255: { 0x0e00, "time-reply" },
! 1256: { 0x0f00, "info-reqst" },
! 1257: { 0x1000, "info-reply" },
! 1258: { 0x1100, "mask-reqst" },
! 1259: { 0x1200, "mask-reply" },
! 1260: { 0, NULL }
! 1261: };
! 1262:
! 1263: static void
! 1264: init_icmparray(void)
! 1265: {
! 1266: register int i;
! 1267: register struct hnamemem *table;
! 1268:
! 1269: for (i = 0; icmp_db[i].s != NULL; i++) {
! 1270: table = &icmptable[icmp_db[i].v & (HASHNAMESIZE-1)];
! 1271: while (table->name)
! 1272: table = table->nxt;
! 1273: table->name = icmp_db[i].s;
! 1274: table->addr = icmp_db[i].v;
! 1275: table->nxt = newhnamemem();
! 1276: }
! 1277: }
! 1278:
! 1279: const char *
! 1280: icmp_string(u_short code)
! 1281: {
! 1282: register struct hnamemem *tp;
! 1283: register u_int32_t i = code;
! 1284: char buf[sizeof("0000")];
! 1285:
! 1286: for (tp = &icmptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 1287: if (tp->addr == i)
! 1288: return (tp->name);
! 1289:
! 1290: tp->addr = i;
! 1291: tp->nxt = newhnamemem();
! 1292:
! 1293: snprintf(buf, sizeof(buf), "%04x", code);
! 1294: tp->name = strdup(buf);
! 1295: return (tp->name);
! 1296: }
! 1297:
! 1298: #ifdef INET6
! 1299: static struct tok icmpv6_db[] = {
! 1300: { 0x0100, "no-route" },
! 1301: { 0x0101, "adm-prhbt" },
! 1302: { 0x0102, "not-nghbr" },
! 1303: { 0x0103, "addr-unrch" },
! 1304: { 0x0104, "bad-port" },
! 1305: { 0x0200, "pkt-toobig" },
! 1306: { 0x0300, "hop-exceed" },
! 1307: { 0x0301, "frg-exceed" },
! 1308: { 0x0400, "bad-hdr" },
! 1309: { 0x0401, "unkn-nhdr" },
! 1310: { 0x0402, "unkn-opt" },
! 1311: { 0x8000, "echo-reqst" },
! 1312: { 0x8100, "echo-repl" },
! 1313: { 0x8200, "membr-qry" },
! 1314: { 0x8300, "membr-rprt" },
! 1315: { 0x8400, "membr-red" },
! 1316: { 0x8500, "router-sol" },
! 1317: { 0x8600, "router-adv" },
! 1318: { 0x8700, "nghbr-sol" },
! 1319: { 0x8800, "nghbr-adv" },
! 1320: { 0x8900, "redirect" },
! 1321: { 0, NULL }
! 1322: };
! 1323:
! 1324: static void
! 1325: init_icmpv6array(void)
! 1326: {
! 1327: register int i;
! 1328: register struct hnamemem *table;
! 1329:
! 1330: for (i = 0; icmpv6_db[i].s != NULL; i++) {
! 1331: table = &icmpv6table[icmpv6_db[i].v & (HASHNAMESIZE-1)];
! 1332: while (table->name)
! 1333: table = table->nxt;
! 1334: table->name = icmpv6_db[i].s;
! 1335: table->addr = icmpv6_db[i].v;
! 1336: table->nxt = newhnamemem();
! 1337: }
! 1338: }
! 1339:
! 1340: const char *
! 1341: icmpv6_string(u_short code)
! 1342: {
! 1343: register struct hnamemem *tp;
! 1344: register u_int32_t i = code;
! 1345: char buf[sizeof("0000")];
! 1346:
! 1347: for (tp = &icmpv6table[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
! 1348: if (tp->addr == i)
! 1349: return (tp->name);
! 1350:
! 1351: tp->addr = i;
! 1352: tp->nxt = newhnamemem();
! 1353:
! 1354: snprintf(buf, sizeof(buf), "%04x", code);
! 1355: tp->name = strdup(buf);
! 1356: return (tp->name);
! 1357: }
! 1358: #endif
! 1359:
! 1360: /*
! 1361: * Initialize the address to name translation machinery. We map all
! 1362: * non-local IP addresses to numeric addresses if fflag is true (i.e.,
! 1363: * to prevent blocking on the nameserver). localnet is the IP address
! 1364: * of the local network. mask is its subnet mask.
! 1365: */
! 1366: void
! 1367: init_addrtoname()
! 1368: {
! 1369: #ifdef notdef
! 1370: if (nflag)
! 1371: /*
! 1372: * Simplest way to suppress names.
! 1373: */
! 1374: return;
! 1375: #endif
! 1376: init_etherarray();
! 1377: init_servarray();
! 1378: init_etypearray();
! 1379: init_llcsaparray();
! 1380: init_protoidarray();
! 1381: init_ipxsaparray();
! 1382: init_iprotoarray();
! 1383: init_icmparray();
! 1384: #ifdef INET6
! 1385: init_icmpv6array();
! 1386: #endif
! 1387: }
! 1388:
! 1389: #ifdef notdef
! 1390: const char *
! 1391: dnaddr_string(u_short dnaddr)
! 1392: {
! 1393: register struct hnamemem *tp;
! 1394:
! 1395: for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0;
! 1396: tp = tp->nxt)
! 1397: if (tp->addr == dnaddr)
! 1398: return (tp->name);
! 1399:
! 1400: tp->addr = dnaddr;
! 1401: tp->nxt = newhnamemem();
! 1402: if (nflag)
! 1403: tp->name = dnnum_string(dnaddr);
! 1404: else
! 1405: tp->name = dnname_string(dnaddr);
! 1406:
! 1407: return(tp->name);
! 1408: }
! 1409: #endif
! 1410:
! 1411: /* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
! 1412: struct hnamemem *
! 1413: newhnamemem(void)
! 1414: {
! 1415: register struct hnamemem *p;
! 1416: static struct hnamemem *ptr = NULL;
! 1417: static u_int num = 0;
! 1418:
! 1419: if (num <= 0) {
! 1420: num = 64;
! 1421: ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
! 1422: if (ptr == NULL)
! 1423: error("newhnamemem: calloc");
! 1424: }
! 1425: --num;
! 1426: p = ptr++;
! 1427: return (p);
! 1428: }
! 1429:
! 1430: #ifdef INET6
! 1431: /* Return a zero'ed h6namemem struct and cuts down on calloc() overhead */
! 1432: struct h6namemem *
! 1433: newh6namemem(void)
! 1434: {
! 1435: register struct h6namemem *p;
! 1436: static struct h6namemem *ptr = NULL;
! 1437: static u_int num = 0;
! 1438:
! 1439: if (num <= 0) {
! 1440: num = 64;
! 1441: ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
! 1442: if (ptr == NULL)
! 1443: error("newh6namemem: calloc");
! 1444: }
! 1445: --num;
! 1446: p = ptr++;
! 1447: return (p);
! 1448: }
! 1449: #endif /* INET6 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>