diff options
author | fenner <fenner@FreeBSD.org> | 2002-06-21 00:49:02 +0000 |
---|---|---|
committer | fenner <fenner@FreeBSD.org> | 2002-06-21 00:49:02 +0000 |
commit | 6d9538de202e4b8787f1b1a2ee8dce6273a43dc2 (patch) | |
tree | cf4df09e1e89ebd11358792543230083e577ad0f /contrib/tcpdump/addrtoname.c | |
parent | d832be42ce7cc0a492cddc15e8429bc29fb46462 (diff) | |
download | FreeBSD-src-6d9538de202e4b8787f1b1a2ee8dce6273a43dc2.zip FreeBSD-src-6d9538de202e4b8787f1b1a2ee8dce6273a43dc2.tar.gz |
Merge tcpdump 3.7.1
MFC after: 2 weeks
Diffstat (limited to 'contrib/tcpdump/addrtoname.c')
-rw-r--r-- | contrib/tcpdump/addrtoname.c | 193 |
1 files changed, 145 insertions, 48 deletions
diff --git a/contrib/tcpdump/addrtoname.c b/contrib/tcpdump/addrtoname.c index e53f41e..19eedbc 100644 --- a/contrib/tcpdump/addrtoname.c +++ b/contrib/tcpdump/addrtoname.c @@ -25,7 +25,7 @@ */ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/addrtoname.c,v 1.69.2.1 2001/01/17 18:29:58 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/addrtoname.c,v 1.83 2001/09/17 21:57:50 fenner Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -60,7 +60,6 @@ struct rtentry; #include "interface.h" #include "addrtoname.h" #include "llc.h" -#include "savestr.h" #include "setsignal.h" /* Forwards */ @@ -74,7 +73,7 @@ static RETSIGTYPE nohostname(int); struct hnamemem { u_int32_t addr; - char *name; + const char *name; struct hnamemem *nxt; }; @@ -99,18 +98,20 @@ struct enamemem { u_short e_addr0; u_short e_addr1; u_short e_addr2; - char *e_name; + const char *e_name; u_char *e_nsap; /* used only for nsaptable[] */ +#define e_bs e_nsap /* for bytestringtable */ struct enamemem *e_nxt; }; struct enamemem enametable[HASHNAMESIZE]; struct enamemem nsaptable[HASHNAMESIZE]; +struct enamemem bytestringtable[HASHNAMESIZE]; struct protoidmem { u_int32_t p_oui; u_short p_proto; - char *p_name; + const char *p_name; struct protoidmem *p_nxt; }; @@ -119,7 +120,7 @@ struct protoidmem protoidtable[HASHNAMESIZE]; /* * A faster replacement for inet_ntoa(). */ -char * +const char * intoa(u_int32_t addr) { register char *cp; @@ -171,18 +172,14 @@ nohostname(int signo) * Return a name for the IP address pointed to by ap. This address * is assumed to be in network byte order. */ -char * +const char * getname(const u_char *ap) { register struct hostent *hp; u_int32_t addr; static struct hnamemem *p; /* static for longjmp() */ -#ifndef LBL_ALIGN - addr = *(const u_int32_t *)ap; -#else memcpy(&addr, ap, sizeof(addr)); -#endif p = &hnametable[addr & (HASHNAMESIZE-1)]; for (; p->nxt; p = p->nxt) { if (p->addr == addr) @@ -212,7 +209,7 @@ getname(const u_char *ap) if (hp) { char *dotp; - p->name = savestr(hp->h_name); + p->name = strdup(hp->h_name); if (Nflag) { /* Remove domain qualifications */ dotp = strchr(p->name, '.'); @@ -223,7 +220,7 @@ getname(const u_char *ap) } } } - p->name = savestr(intoa(addr)); + p->name = strdup(intoa(addr)); return (p->name); } @@ -232,13 +229,13 @@ getname(const u_char *ap) * Return a name for the IP6 address pointed to by ap. This address * is assumed to be in network byte order. */ -char * +const char * getname6(const u_char *ap) { register struct hostent *hp; struct in6_addr addr; static struct h6namemem *p; /* static for longjmp() */ - register char *cp; + register const char *cp; char ntop_buf[INET6_ADDRSTRLEN]; memcpy(&addr, ap, sizeof(addr)); @@ -275,7 +272,7 @@ getname6(const u_char *ap) if (hp) { char *dotp; - p->name = savestr(hp->h_name); + p->name = strdup(hp->h_name); if (Nflag) { /* Remove domain qualifications */ dotp = strchr(p->name, '.'); @@ -286,8 +283,8 @@ getname6(const u_char *ap) } } } - cp = (char *)inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf)); - p->name = savestr(cp); + cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf)); + p->name = strdup(cp); return (p->name); } #endif /* INET6 */ @@ -325,13 +322,58 @@ lookup_emem(const u_char *ep) return tp; } +/* + * Find the hash node that corresponds to the bytestring 'bs' + * with length 'nlen' + */ + +static inline struct enamemem * +lookup_bytestring(register const u_char *bs, const unsigned int nlen) +{ + struct enamemem *tp; + register u_int i, j, k; + + if (nlen >= 6) { + k = (bs[0] << 8) | bs[1]; + j = (bs[2] << 8) | bs[3]; + i = (bs[4] << 8) | bs[5]; + } else if (nlen >= 4) { + k = (bs[0] << 8) | bs[1]; + j = (bs[2] << 8) | bs[3]; + i = 0; + } else + i = j = k = 0; + + tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)]; + while (tp->e_nxt) + if (tp->e_addr0 == i && + tp->e_addr1 == j && + tp->e_addr2 == k && + memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0) + return tp; + else + tp = tp->e_nxt; + + tp->e_addr0 = i; + tp->e_addr1 = j; + tp->e_addr2 = k; + + tp->e_bs = (u_char *) calloc(1, nlen + 1); + memcpy(tp->e_bs, bs, nlen); + tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); + if (tp->e_nxt == NULL) + error("lookup_bytestring: calloc"); + + return tp; +} + /* Find the hash node that corresponds the NSAP 'nsap' */ static inline struct enamemem * lookup_nsap(register const u_char *nsap) { register u_int i, j, k; - int nlen = *nsap; + unsigned int nlen = *nsap; struct enamemem *tp; const u_char *ensap = nsap + nlen - 6; @@ -349,7 +391,7 @@ lookup_nsap(register const u_char *nsap) tp->e_addr1 == j && tp->e_addr2 == k && tp->e_nsap[0] == nlen && - memcmp((char *)&(nsap[1]), + memcmp((const char *)&(nsap[1]), (char *)&(tp->e_nsap[1]), nlen) == 0) return tp; else @@ -360,7 +402,7 @@ lookup_nsap(register const u_char *nsap) tp->e_nsap = (u_char *)malloc(nlen + 1); if (tp->e_nsap == NULL) error("lookup_nsap: malloc"); - memcpy((char *)tp->e_nsap, (char *)nsap, nlen + 1); + memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1); tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); if (tp->e_nxt == NULL) error("lookup_nsap: calloc"); @@ -396,7 +438,7 @@ lookup_protoid(const u_char *pi) return tp; } -char * +const char * etheraddr_string(register const u_char *ep) { register u_int i, j; @@ -407,11 +449,11 @@ etheraddr_string(register const u_char *ep) tp = lookup_emem(ep); if (tp->e_name) return (tp->e_name); -#ifdef HAVE_ETHER_NTOHOST +#ifdef USE_ETHER_NTOHOST if (!nflag) { char buf[128]; - if (ether_ntohost(buf, (struct ether_addr *)ep) == 0) { - tp->e_name = savestr(buf); + if (ether_ntohost(buf, (const struct ether_addr *)ep) == 0) { + tp->e_name = strdup(buf); return (tp->e_name); } } @@ -427,11 +469,41 @@ etheraddr_string(register const u_char *ep) *cp++ = hex[*ep++ & 0xf]; } *cp = '\0'; - tp->e_name = savestr(buf); + tp->e_name = strdup(buf); return (tp->e_name); } -char * +const char * +linkaddr_string(const u_char *ep, const unsigned int len) +{ + register u_int i, j; + register char *cp; + register struct enamemem *tp; + + if (len == 6) /* XXX not totally correct... */ + return etheraddr_string(ep); + + tp = lookup_bytestring(ep, len); + if (tp->e_name) + return (tp->e_name); + + tp->e_name = cp = (char *)malloc(len*3); + if (tp->e_name == NULL) + error("linkaddr_string: malloc"); + if ((j = *ep >> 4) != 0) + *cp++ = hex[j]; + *cp++ = hex[*ep++ & 0xf]; + for (i = len-1; i > 0 ; --i) { + *cp++ = ':'; + if ((j = *ep >> 4) != 0) + *cp++ = hex[j]; + *cp++ = hex[*ep++ & 0xf]; + } + *cp = '\0'; + return (tp->e_name); +} + +const char * etherproto_string(u_short port) { register char *cp; @@ -453,11 +525,11 @@ etherproto_string(u_short port) *cp++ = hex[port >> 4 & 0xf]; *cp++ = hex[port & 0xf]; *cp++ = '\0'; - tp->name = savestr(buf); + tp->name = strdup(buf); return (tp->name); } -char * +const char * protoid_string(register const u_char *pi) { register u_int i, j; @@ -480,11 +552,11 @@ protoid_string(register const u_char *pi) *cp++ = hex[*pi++ & 0xf]; } *cp = '\0'; - tp->p_name = savestr(buf); + tp->p_name = strdup(buf); return (tp->p_name); } -char * +const char * llcsap_string(u_char sap) { register struct hnamemem *tp; @@ -499,11 +571,11 @@ llcsap_string(u_char sap) tp->nxt = newhnamemem(); snprintf(buf, sizeof(buf), "sap %02x", sap & 0xff); - tp->name = savestr(buf); + tp->name = strdup(buf); return (tp->name); } -char * +const char * isonsap_string(const u_char *nsap) { register u_int i, nlen = nsap[0]; @@ -529,7 +601,7 @@ isonsap_string(const u_char *nsap) return (tp->e_name); } -char * +const char * tcpport_string(u_short port) { register struct hnamemem *tp; @@ -544,11 +616,11 @@ tcpport_string(u_short port) tp->nxt = newhnamemem(); (void)snprintf(buf, sizeof(buf), "%u", i); - tp->name = savestr(buf); + tp->name = strdup(buf); return (tp->name); } -char * +const char * udpport_string(register u_short port) { register struct hnamemem *tp; @@ -563,7 +635,7 @@ udpport_string(register u_short port) tp->nxt = newhnamemem(); (void)snprintf(buf, sizeof(buf), "%u", i); - tp->name = savestr(buf); + tp->name = strdup(buf); return (tp->name); } @@ -589,9 +661,9 @@ init_servarray(void) table = table->nxt; if (nflag) { (void)snprintf(buf, sizeof(buf), "%d", port); - table->name = savestr(buf); + table->name = strdup(buf); } else - table->name = savestr(sv->s_name); + table->name = strdup(sv->s_name); table->addr = port; table->nxt = newhnamemem(); } @@ -621,6 +693,18 @@ init_eprotoarray(void) } } +static struct protoidlist { + const u_char protoid[5]; + const char *name; +} protoidlist[] = { + {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" }, + {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" }, + {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" }, + {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" }, + {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" }, + {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL } +}; + /* * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet * types. @@ -630,6 +714,7 @@ init_protoidarray(void) { register int i; register struct protoidmem *tp; + struct protoidlist *pl; u_char protoid[5]; protoid[0] = 0; @@ -640,13 +725,22 @@ init_protoidarray(void) memcpy((char *)&protoid[3], (char *)&etype, 2); tp = lookup_protoid(protoid); - tp->p_name = savestr(eproto_db[i].s); + tp->p_name = strdup(eproto_db[i].s); + } + /* Hardwire some SNAP proto ID names */ + for (pl = protoidlist; pl->name != NULL; ++pl) { + tp = lookup_protoid(pl->protoid); + /* Don't override existing name */ + if (tp->p_name != NULL) + continue; + + tp->p_name = pl->name; } } static struct etherlist { - u_char addr[6]; - char *name; + const u_char addr[6]; + const char *name; } etherlist[] = { {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "Broadcast" }, {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL } @@ -671,7 +765,7 @@ init_etherarray(void) { register struct etherlist *el; register struct enamemem *tp; -#ifdef HAVE_ETHER_NTOHOST +#ifdef USE_ETHER_NTOHOST char name[256]; #else register struct pcap_etherent *ep; @@ -682,7 +776,7 @@ init_etherarray(void) if (fp != NULL) { while ((ep = pcap_next_etherent(fp)) != NULL) { tp = lookup_emem(ep->addr); - tp->e_name = savestr(ep->name); + tp->e_name = strdup(ep->name); } (void)fclose(fp); } @@ -695,10 +789,10 @@ init_etherarray(void) if (tp->e_name != NULL) continue; -#ifdef HAVE_ETHER_NTOHOST +#ifdef USE_ETHER_NTOHOST /* Use yp/nis version of name if available */ - if (ether_ntohost(name, (struct ether_addr *)el->addr) == 0) { - tp->e_name = savestr(name); + if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) { + tp->e_name = strdup(name); continue; } #endif @@ -716,6 +810,9 @@ static struct tok llcsap_db[] = { { LLCSAP_RS511, "eia-rs511" }, { LLCSAP_ISO8208, "x.25/llc2" }, { LLCSAP_PROWAY, "proway" }, + { LLCSAP_SNAP, "snap" }, + { LLCSAP_IPX, "IPX" }, + { LLCSAP_NETBEUI, "netbeui" }, { LLCSAP_ISONS, "iso-clns" }, { LLCSAP_GLOBAL, "global" }, { 0, NULL } @@ -764,7 +861,7 @@ init_addrtoname(u_int32_t localnet, u_int32_t mask) init_protoidarray(); } -char * +const char * dnaddr_string(u_short dnaddr) { register struct hnamemem *tp; |