summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/addrtoname.c
diff options
context:
space:
mode:
authorfenner <fenner@FreeBSD.org>2002-06-21 00:49:02 +0000
committerfenner <fenner@FreeBSD.org>2002-06-21 00:49:02 +0000
commit6d9538de202e4b8787f1b1a2ee8dce6273a43dc2 (patch)
treecf4df09e1e89ebd11358792543230083e577ad0f /contrib/tcpdump/addrtoname.c
parentd832be42ce7cc0a492cddc15e8429bc29fb46462 (diff)
downloadFreeBSD-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.c193
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;
OpenPOWER on IntegriCloud