File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / trafshow / addrtoname.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:55:18 2012 UTC (12 years, 4 months ago) by misho
Branches: trafshow, MAIN
CVS tags: v5_2_3p0, v5_2_3, HEAD
trafshow

    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: /usr/local/www/users/anoncvs/cvs/embedaddon/trafshow/addrtoname.c,v 1.1.1.1 2012/02/21 16:55:18 misho 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>