1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3*b636d99dSDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
4*b636d99dSDavid van Moolenbroek *
5*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code distributions
7*b636d99dSDavid van Moolenbroek * retain the above copyright notice and this paragraph in its entirety, (2)
8*b636d99dSDavid van Moolenbroek * distributions including binary code include the above copyright notice and
9*b636d99dSDavid van Moolenbroek * this paragraph in its entirety in the documentation or other materials
10*b636d99dSDavid van Moolenbroek * provided with the distribution, and (3) all advertising materials mentioning
11*b636d99dSDavid van Moolenbroek * features or use of this software display the following acknowledgement:
12*b636d99dSDavid van Moolenbroek * ``This product includes software developed by the University of California,
13*b636d99dSDavid van Moolenbroek * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*b636d99dSDavid van Moolenbroek * the University nor the names of its contributors may be used to endorse
15*b636d99dSDavid van Moolenbroek * or promote products derived from this software without specific prior
16*b636d99dSDavid van Moolenbroek * written permission.
17*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*b636d99dSDavid van Moolenbroek * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*b636d99dSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*b636d99dSDavid van Moolenbroek *
21*b636d99dSDavid van Moolenbroek * Internet, ethernet, port, and protocol string to address
22*b636d99dSDavid van Moolenbroek * and address to string conversion routines
23*b636d99dSDavid van Moolenbroek */
24*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
25*b636d99dSDavid van Moolenbroek #ifndef lint
26*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: addrtoname.c,v 1.7 2015/03/31 21:59:35 christos Exp $");
27*b636d99dSDavid van Moolenbroek #endif
28*b636d99dSDavid van Moolenbroek
29*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
30*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
31*b636d99dSDavid van Moolenbroek #include "config.h"
32*b636d99dSDavid van Moolenbroek #endif
33*b636d99dSDavid van Moolenbroek
34*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
35*b636d99dSDavid van Moolenbroek
36*b636d99dSDavid van Moolenbroek #ifdef USE_ETHER_NTOHOST
37*b636d99dSDavid van Moolenbroek #ifdef HAVE_NETINET_IF_ETHER_H
38*b636d99dSDavid van Moolenbroek struct mbuf; /* Squelch compiler warnings on some platforms for */
39*b636d99dSDavid van Moolenbroek struct rtentry; /* declarations in <net/if.h> */
40*b636d99dSDavid van Moolenbroek #include <net/if.h> /* for "struct ifnet" in "struct arpcom" on Solaris */
41*b636d99dSDavid van Moolenbroek #include <netinet/if_ether.h>
42*b636d99dSDavid van Moolenbroek #endif /* HAVE_NETINET_IF_ETHER_H */
43*b636d99dSDavid van Moolenbroek #ifdef NETINET_ETHER_H_DECLARES_ETHER_NTOHOST
44*b636d99dSDavid van Moolenbroek #include <netinet/ether.h>
45*b636d99dSDavid van Moolenbroek #endif /* NETINET_ETHER_H_DECLARES_ETHER_NTOHOST */
46*b636d99dSDavid van Moolenbroek
47*b636d99dSDavid van Moolenbroek #if !defined(HAVE_DECL_ETHER_NTOHOST) || !HAVE_DECL_ETHER_NTOHOST
48*b636d99dSDavid van Moolenbroek #ifndef HAVE_STRUCT_ETHER_ADDR
49*b636d99dSDavid van Moolenbroek struct ether_addr {
50*b636d99dSDavid van Moolenbroek unsigned char ether_addr_octet[6];
51*b636d99dSDavid van Moolenbroek };
52*b636d99dSDavid van Moolenbroek #endif
53*b636d99dSDavid van Moolenbroek extern int ether_ntohost(char *, const struct ether_addr *);
54*b636d99dSDavid van Moolenbroek #endif
55*b636d99dSDavid van Moolenbroek
56*b636d99dSDavid van Moolenbroek #endif /* USE_ETHER_NTOHOST */
57*b636d99dSDavid van Moolenbroek
58*b636d99dSDavid van Moolenbroek #include <pcap.h>
59*b636d99dSDavid van Moolenbroek #include <pcap-namedb.h>
60*b636d99dSDavid van Moolenbroek #include <signal.h>
61*b636d99dSDavid van Moolenbroek #include <stdio.h>
62*b636d99dSDavid van Moolenbroek #include <string.h>
63*b636d99dSDavid van Moolenbroek #include <stdlib.h>
64*b636d99dSDavid van Moolenbroek
65*b636d99dSDavid van Moolenbroek #include "interface.h"
66*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
67*b636d99dSDavid van Moolenbroek #include "llc.h"
68*b636d99dSDavid van Moolenbroek #include "setsignal.h"
69*b636d99dSDavid van Moolenbroek #include "extract.h"
70*b636d99dSDavid van Moolenbroek #include "oui.h"
71*b636d99dSDavid van Moolenbroek
72*b636d99dSDavid van Moolenbroek #ifndef ETHER_ADDR_LEN
73*b636d99dSDavid van Moolenbroek #define ETHER_ADDR_LEN 6
74*b636d99dSDavid van Moolenbroek #endif
75*b636d99dSDavid van Moolenbroek
76*b636d99dSDavid van Moolenbroek /*
77*b636d99dSDavid van Moolenbroek * hash tables for whatever-to-name translations
78*b636d99dSDavid van Moolenbroek *
79*b636d99dSDavid van Moolenbroek * XXX there has to be error checks against strdup(3) failure
80*b636d99dSDavid van Moolenbroek */
81*b636d99dSDavid van Moolenbroek
82*b636d99dSDavid van Moolenbroek #define HASHNAMESIZE 4096
83*b636d99dSDavid van Moolenbroek
84*b636d99dSDavid van Moolenbroek struct hnamemem {
85*b636d99dSDavid van Moolenbroek uint32_t addr;
86*b636d99dSDavid van Moolenbroek const char *name;
87*b636d99dSDavid van Moolenbroek struct hnamemem *nxt;
88*b636d99dSDavid van Moolenbroek };
89*b636d99dSDavid van Moolenbroek
90*b636d99dSDavid van Moolenbroek static struct hnamemem hnametable[HASHNAMESIZE];
91*b636d99dSDavid van Moolenbroek static struct hnamemem tporttable[HASHNAMESIZE];
92*b636d99dSDavid van Moolenbroek static struct hnamemem uporttable[HASHNAMESIZE];
93*b636d99dSDavid van Moolenbroek static struct hnamemem eprototable[HASHNAMESIZE];
94*b636d99dSDavid van Moolenbroek static struct hnamemem dnaddrtable[HASHNAMESIZE];
95*b636d99dSDavid van Moolenbroek static struct hnamemem ipxsaptable[HASHNAMESIZE];
96*b636d99dSDavid van Moolenbroek
97*b636d99dSDavid van Moolenbroek #if defined(INET6) && defined(WIN32)
98*b636d99dSDavid van Moolenbroek /*
99*b636d99dSDavid van Moolenbroek * fake gethostbyaddr for Win2k/XP
100*b636d99dSDavid van Moolenbroek * gethostbyaddr() returns incorrect value when AF_INET6 is passed
101*b636d99dSDavid van Moolenbroek * to 3rd argument.
102*b636d99dSDavid van Moolenbroek *
103*b636d99dSDavid van Moolenbroek * h_name in struct hostent is only valid.
104*b636d99dSDavid van Moolenbroek */
105*b636d99dSDavid van Moolenbroek static struct hostent *
win32_gethostbyaddr(const char * addr,int len,int type)106*b636d99dSDavid van Moolenbroek win32_gethostbyaddr(const char *addr, int len, int type)
107*b636d99dSDavid van Moolenbroek {
108*b636d99dSDavid van Moolenbroek static struct hostent host;
109*b636d99dSDavid van Moolenbroek static char hostbuf[NI_MAXHOST];
110*b636d99dSDavid van Moolenbroek char hname[NI_MAXHOST];
111*b636d99dSDavid van Moolenbroek struct sockaddr_in6 addr6;
112*b636d99dSDavid van Moolenbroek
113*b636d99dSDavid van Moolenbroek host.h_name = hostbuf;
114*b636d99dSDavid van Moolenbroek switch (type) {
115*b636d99dSDavid van Moolenbroek case AF_INET:
116*b636d99dSDavid van Moolenbroek return gethostbyaddr(addr, len, type);
117*b636d99dSDavid van Moolenbroek break;
118*b636d99dSDavid van Moolenbroek case AF_INET6:
119*b636d99dSDavid van Moolenbroek memset(&addr6, 0, sizeof(addr6));
120*b636d99dSDavid van Moolenbroek addr6.sin6_family = AF_INET6;
121*b636d99dSDavid van Moolenbroek memcpy(&addr6.sin6_addr, addr, len);
122*b636d99dSDavid van Moolenbroek if (getnameinfo((struct sockaddr *)&addr6, sizeof(addr6),
123*b636d99dSDavid van Moolenbroek hname, sizeof(hname), NULL, 0, 0)) {
124*b636d99dSDavid van Moolenbroek return NULL;
125*b636d99dSDavid van Moolenbroek } else {
126*b636d99dSDavid van Moolenbroek strcpy(host.h_name, hname);
127*b636d99dSDavid van Moolenbroek return &host;
128*b636d99dSDavid van Moolenbroek }
129*b636d99dSDavid van Moolenbroek break;
130*b636d99dSDavid van Moolenbroek default:
131*b636d99dSDavid van Moolenbroek return NULL;
132*b636d99dSDavid van Moolenbroek }
133*b636d99dSDavid van Moolenbroek }
134*b636d99dSDavid van Moolenbroek #define gethostbyaddr win32_gethostbyaddr
135*b636d99dSDavid van Moolenbroek #endif /* INET6 & WIN32 */
136*b636d99dSDavid van Moolenbroek
137*b636d99dSDavid van Moolenbroek #ifdef INET6
138*b636d99dSDavid van Moolenbroek struct h6namemem {
139*b636d99dSDavid van Moolenbroek struct in6_addr addr;
140*b636d99dSDavid van Moolenbroek char *name;
141*b636d99dSDavid van Moolenbroek struct h6namemem *nxt;
142*b636d99dSDavid van Moolenbroek };
143*b636d99dSDavid van Moolenbroek
144*b636d99dSDavid van Moolenbroek static struct h6namemem h6nametable[HASHNAMESIZE];
145*b636d99dSDavid van Moolenbroek #endif /* INET6 */
146*b636d99dSDavid van Moolenbroek
147*b636d99dSDavid van Moolenbroek struct enamemem {
148*b636d99dSDavid van Moolenbroek u_short e_addr0;
149*b636d99dSDavid van Moolenbroek u_short e_addr1;
150*b636d99dSDavid van Moolenbroek u_short e_addr2;
151*b636d99dSDavid van Moolenbroek const char *e_name;
152*b636d99dSDavid van Moolenbroek u_char *e_nsap; /* used only for nsaptable[] */
153*b636d99dSDavid van Moolenbroek #define e_bs e_nsap /* for bytestringtable */
154*b636d99dSDavid van Moolenbroek struct enamemem *e_nxt;
155*b636d99dSDavid van Moolenbroek };
156*b636d99dSDavid van Moolenbroek
157*b636d99dSDavid van Moolenbroek static struct enamemem enametable[HASHNAMESIZE];
158*b636d99dSDavid van Moolenbroek static struct enamemem nsaptable[HASHNAMESIZE];
159*b636d99dSDavid van Moolenbroek static struct enamemem bytestringtable[HASHNAMESIZE];
160*b636d99dSDavid van Moolenbroek
161*b636d99dSDavid van Moolenbroek struct protoidmem {
162*b636d99dSDavid van Moolenbroek uint32_t p_oui;
163*b636d99dSDavid van Moolenbroek u_short p_proto;
164*b636d99dSDavid van Moolenbroek const char *p_name;
165*b636d99dSDavid van Moolenbroek struct protoidmem *p_nxt;
166*b636d99dSDavid van Moolenbroek };
167*b636d99dSDavid van Moolenbroek
168*b636d99dSDavid van Moolenbroek static struct protoidmem protoidtable[HASHNAMESIZE];
169*b636d99dSDavid van Moolenbroek
170*b636d99dSDavid van Moolenbroek /*
171*b636d99dSDavid van Moolenbroek * A faster replacement for inet_ntoa().
172*b636d99dSDavid van Moolenbroek */
173*b636d99dSDavid van Moolenbroek const char *
intoa(uint32_t addr)174*b636d99dSDavid van Moolenbroek intoa(uint32_t addr)
175*b636d99dSDavid van Moolenbroek {
176*b636d99dSDavid van Moolenbroek register char *cp;
177*b636d99dSDavid van Moolenbroek register u_int byte;
178*b636d99dSDavid van Moolenbroek register int n;
179*b636d99dSDavid van Moolenbroek static char buf[sizeof(".xxx.xxx.xxx.xxx")];
180*b636d99dSDavid van Moolenbroek
181*b636d99dSDavid van Moolenbroek NTOHL(addr);
182*b636d99dSDavid van Moolenbroek cp = buf + sizeof(buf);
183*b636d99dSDavid van Moolenbroek *--cp = '\0';
184*b636d99dSDavid van Moolenbroek
185*b636d99dSDavid van Moolenbroek n = 4;
186*b636d99dSDavid van Moolenbroek do {
187*b636d99dSDavid van Moolenbroek byte = addr & 0xff;
188*b636d99dSDavid van Moolenbroek *--cp = byte % 10 + '0';
189*b636d99dSDavid van Moolenbroek byte /= 10;
190*b636d99dSDavid van Moolenbroek if (byte > 0) {
191*b636d99dSDavid van Moolenbroek *--cp = byte % 10 + '0';
192*b636d99dSDavid van Moolenbroek byte /= 10;
193*b636d99dSDavid van Moolenbroek if (byte > 0)
194*b636d99dSDavid van Moolenbroek *--cp = byte + '0';
195*b636d99dSDavid van Moolenbroek }
196*b636d99dSDavid van Moolenbroek *--cp = '.';
197*b636d99dSDavid van Moolenbroek addr >>= 8;
198*b636d99dSDavid van Moolenbroek } while (--n > 0);
199*b636d99dSDavid van Moolenbroek
200*b636d99dSDavid van Moolenbroek return cp + 1;
201*b636d99dSDavid van Moolenbroek }
202*b636d99dSDavid van Moolenbroek
203*b636d99dSDavid van Moolenbroek static uint32_t f_netmask;
204*b636d99dSDavid van Moolenbroek static uint32_t f_localnet;
205*b636d99dSDavid van Moolenbroek
206*b636d99dSDavid van Moolenbroek /*
207*b636d99dSDavid van Moolenbroek * Return a name for the IP address pointed to by ap. This address
208*b636d99dSDavid van Moolenbroek * is assumed to be in network byte order.
209*b636d99dSDavid van Moolenbroek *
210*b636d99dSDavid van Moolenbroek * NOTE: ap is *NOT* necessarily part of the packet data (not even if
211*b636d99dSDavid van Moolenbroek * this is being called with the "ipaddr_string()" macro), so you
212*b636d99dSDavid van Moolenbroek * *CANNOT* use the TCHECK{2}/TTEST{2} macros on it. Furthermore,
213*b636d99dSDavid van Moolenbroek * even in cases where it *is* part of the packet data, the caller
214*b636d99dSDavid van Moolenbroek * would still have to check for a null return value, even if it's
215*b636d99dSDavid van Moolenbroek * just printing the return value with "%s" - not all versions of
216*b636d99dSDavid van Moolenbroek * printf print "(null)" with "%s" and a null pointer, some of them
217*b636d99dSDavid van Moolenbroek * don't check for a null pointer and crash in that case.
218*b636d99dSDavid van Moolenbroek *
219*b636d99dSDavid van Moolenbroek * The callers of this routine should, before handing this routine
220*b636d99dSDavid van Moolenbroek * a pointer to packet data, be sure that the data is present in
221*b636d99dSDavid van Moolenbroek * the packet buffer. They should probably do those checks anyway,
222*b636d99dSDavid van Moolenbroek * as other data at that layer might not be IP addresses, and it
223*b636d99dSDavid van Moolenbroek * also needs to check whether they're present in the packet buffer.
224*b636d99dSDavid van Moolenbroek */
225*b636d99dSDavid van Moolenbroek const char *
getname(netdissect_options * ndo,const u_char * ap)226*b636d99dSDavid van Moolenbroek getname(netdissect_options *ndo, const u_char *ap)
227*b636d99dSDavid van Moolenbroek {
228*b636d99dSDavid van Moolenbroek register struct hostent *hp;
229*b636d99dSDavid van Moolenbroek uint32_t addr;
230*b636d99dSDavid van Moolenbroek static struct hnamemem *p; /* static for longjmp() */
231*b636d99dSDavid van Moolenbroek
232*b636d99dSDavid van Moolenbroek memcpy(&addr, ap, sizeof(addr));
233*b636d99dSDavid van Moolenbroek p = &hnametable[addr & (HASHNAMESIZE-1)];
234*b636d99dSDavid van Moolenbroek for (; p->nxt; p = p->nxt) {
235*b636d99dSDavid van Moolenbroek if (p->addr == addr)
236*b636d99dSDavid van Moolenbroek return (p->name);
237*b636d99dSDavid van Moolenbroek }
238*b636d99dSDavid van Moolenbroek p->addr = addr;
239*b636d99dSDavid van Moolenbroek p->nxt = newhnamemem();
240*b636d99dSDavid van Moolenbroek
241*b636d99dSDavid van Moolenbroek /*
242*b636d99dSDavid van Moolenbroek * Print names unless:
243*b636d99dSDavid van Moolenbroek * (1) -n was given.
244*b636d99dSDavid van Moolenbroek * (2) Address is foreign and -f was given. (If -f was not
245*b636d99dSDavid van Moolenbroek * given, f_netmask and f_localnet are 0 and the test
246*b636d99dSDavid van Moolenbroek * evaluates to true)
247*b636d99dSDavid van Moolenbroek */
248*b636d99dSDavid van Moolenbroek if (!ndo->ndo_nflag &&
249*b636d99dSDavid van Moolenbroek (addr & f_netmask) == f_localnet) {
250*b636d99dSDavid van Moolenbroek hp = gethostbyaddr((char *)&addr, 4, AF_INET);
251*b636d99dSDavid van Moolenbroek if (hp) {
252*b636d99dSDavid van Moolenbroek char *dotp;
253*b636d99dSDavid van Moolenbroek
254*b636d99dSDavid van Moolenbroek p->name = strdup(hp->h_name);
255*b636d99dSDavid van Moolenbroek if (ndo->ndo_Nflag) {
256*b636d99dSDavid van Moolenbroek /* Remove domain qualifications */
257*b636d99dSDavid van Moolenbroek dotp = strchr(p->name, '.');
258*b636d99dSDavid van Moolenbroek if (dotp)
259*b636d99dSDavid van Moolenbroek *dotp = '\0';
260*b636d99dSDavid van Moolenbroek }
261*b636d99dSDavid van Moolenbroek return (p->name);
262*b636d99dSDavid van Moolenbroek }
263*b636d99dSDavid van Moolenbroek }
264*b636d99dSDavid van Moolenbroek p->name = strdup(intoa(addr));
265*b636d99dSDavid van Moolenbroek return (p->name);
266*b636d99dSDavid van Moolenbroek }
267*b636d99dSDavid van Moolenbroek
268*b636d99dSDavid van Moolenbroek #ifdef INET6
269*b636d99dSDavid van Moolenbroek /*
270*b636d99dSDavid van Moolenbroek * Return a name for the IP6 address pointed to by ap. This address
271*b636d99dSDavid van Moolenbroek * is assumed to be in network byte order.
272*b636d99dSDavid van Moolenbroek */
273*b636d99dSDavid van Moolenbroek const char *
getname6(netdissect_options * ndo,const u_char * ap)274*b636d99dSDavid van Moolenbroek getname6(netdissect_options *ndo, const u_char *ap)
275*b636d99dSDavid van Moolenbroek {
276*b636d99dSDavid van Moolenbroek register struct hostent *hp;
277*b636d99dSDavid van Moolenbroek union {
278*b636d99dSDavid van Moolenbroek struct in6_addr addr;
279*b636d99dSDavid van Moolenbroek struct for_hash_addr {
280*b636d99dSDavid van Moolenbroek char fill[14];
281*b636d99dSDavid van Moolenbroek uint16_t d;
282*b636d99dSDavid van Moolenbroek } addra;
283*b636d99dSDavid van Moolenbroek } addr;
284*b636d99dSDavid van Moolenbroek static struct h6namemem *p; /* static for longjmp() */
285*b636d99dSDavid van Moolenbroek register const char *cp;
286*b636d99dSDavid van Moolenbroek char ntop_buf[INET6_ADDRSTRLEN];
287*b636d99dSDavid van Moolenbroek
288*b636d99dSDavid van Moolenbroek memcpy(&addr, ap, sizeof(addr));
289*b636d99dSDavid van Moolenbroek p = &h6nametable[addr.addra.d & (HASHNAMESIZE-1)];
290*b636d99dSDavid van Moolenbroek for (; p->nxt; p = p->nxt) {
291*b636d99dSDavid van Moolenbroek if (memcmp(&p->addr, &addr, sizeof(addr)) == 0)
292*b636d99dSDavid van Moolenbroek return (p->name);
293*b636d99dSDavid van Moolenbroek }
294*b636d99dSDavid van Moolenbroek p->addr = addr.addr;
295*b636d99dSDavid van Moolenbroek p->nxt = newh6namemem();
296*b636d99dSDavid van Moolenbroek
297*b636d99dSDavid van Moolenbroek /*
298*b636d99dSDavid van Moolenbroek * Do not print names if -n was given.
299*b636d99dSDavid van Moolenbroek */
300*b636d99dSDavid van Moolenbroek if (!ndo->ndo_nflag) {
301*b636d99dSDavid van Moolenbroek hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6);
302*b636d99dSDavid van Moolenbroek if (hp) {
303*b636d99dSDavid van Moolenbroek char *dotp;
304*b636d99dSDavid van Moolenbroek
305*b636d99dSDavid van Moolenbroek p->name = strdup(hp->h_name);
306*b636d99dSDavid van Moolenbroek if (ndo->ndo_Nflag) {
307*b636d99dSDavid van Moolenbroek /* Remove domain qualifications */
308*b636d99dSDavid van Moolenbroek dotp = strchr(p->name, '.');
309*b636d99dSDavid van Moolenbroek if (dotp)
310*b636d99dSDavid van Moolenbroek *dotp = '\0';
311*b636d99dSDavid van Moolenbroek }
312*b636d99dSDavid van Moolenbroek return (p->name);
313*b636d99dSDavid van Moolenbroek }
314*b636d99dSDavid van Moolenbroek }
315*b636d99dSDavid van Moolenbroek cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf));
316*b636d99dSDavid van Moolenbroek p->name = strdup(cp);
317*b636d99dSDavid van Moolenbroek return (p->name);
318*b636d99dSDavid van Moolenbroek }
319*b636d99dSDavid van Moolenbroek #endif /* INET6 */
320*b636d99dSDavid van Moolenbroek
321*b636d99dSDavid van Moolenbroek static const char hex[] = "0123456789abcdef";
322*b636d99dSDavid van Moolenbroek
323*b636d99dSDavid van Moolenbroek
324*b636d99dSDavid van Moolenbroek /* Find the hash node that corresponds the ether address 'ep' */
325*b636d99dSDavid van Moolenbroek
326*b636d99dSDavid van Moolenbroek static inline struct enamemem *
lookup_emem(const u_char * ep)327*b636d99dSDavid van Moolenbroek lookup_emem(const u_char *ep)
328*b636d99dSDavid van Moolenbroek {
329*b636d99dSDavid van Moolenbroek register u_int i, j, k;
330*b636d99dSDavid van Moolenbroek struct enamemem *tp;
331*b636d99dSDavid van Moolenbroek
332*b636d99dSDavid van Moolenbroek k = (ep[0] << 8) | ep[1];
333*b636d99dSDavid van Moolenbroek j = (ep[2] << 8) | ep[3];
334*b636d99dSDavid van Moolenbroek i = (ep[4] << 8) | ep[5];
335*b636d99dSDavid van Moolenbroek
336*b636d99dSDavid van Moolenbroek tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)];
337*b636d99dSDavid van Moolenbroek while (tp->e_nxt)
338*b636d99dSDavid van Moolenbroek if (tp->e_addr0 == i &&
339*b636d99dSDavid van Moolenbroek tp->e_addr1 == j &&
340*b636d99dSDavid van Moolenbroek tp->e_addr2 == k)
341*b636d99dSDavid van Moolenbroek return tp;
342*b636d99dSDavid van Moolenbroek else
343*b636d99dSDavid van Moolenbroek tp = tp->e_nxt;
344*b636d99dSDavid van Moolenbroek tp->e_addr0 = i;
345*b636d99dSDavid van Moolenbroek tp->e_addr1 = j;
346*b636d99dSDavid van Moolenbroek tp->e_addr2 = k;
347*b636d99dSDavid van Moolenbroek tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
348*b636d99dSDavid van Moolenbroek if (tp->e_nxt == NULL)
349*b636d99dSDavid van Moolenbroek error("lookup_emem: calloc");
350*b636d99dSDavid van Moolenbroek
351*b636d99dSDavid van Moolenbroek return tp;
352*b636d99dSDavid van Moolenbroek }
353*b636d99dSDavid van Moolenbroek
354*b636d99dSDavid van Moolenbroek /*
355*b636d99dSDavid van Moolenbroek * Find the hash node that corresponds to the bytestring 'bs'
356*b636d99dSDavid van Moolenbroek * with length 'nlen'
357*b636d99dSDavid van Moolenbroek */
358*b636d99dSDavid van Moolenbroek
359*b636d99dSDavid van Moolenbroek static inline struct enamemem *
lookup_bytestring(register const u_char * bs,const unsigned int nlen)360*b636d99dSDavid van Moolenbroek lookup_bytestring(register const u_char *bs, const unsigned int nlen)
361*b636d99dSDavid van Moolenbroek {
362*b636d99dSDavid van Moolenbroek struct enamemem *tp;
363*b636d99dSDavid van Moolenbroek register u_int i, j, k;
364*b636d99dSDavid van Moolenbroek
365*b636d99dSDavid van Moolenbroek if (nlen >= 6) {
366*b636d99dSDavid van Moolenbroek k = (bs[0] << 8) | bs[1];
367*b636d99dSDavid van Moolenbroek j = (bs[2] << 8) | bs[3];
368*b636d99dSDavid van Moolenbroek i = (bs[4] << 8) | bs[5];
369*b636d99dSDavid van Moolenbroek } else if (nlen >= 4) {
370*b636d99dSDavid van Moolenbroek k = (bs[0] << 8) | bs[1];
371*b636d99dSDavid van Moolenbroek j = (bs[2] << 8) | bs[3];
372*b636d99dSDavid van Moolenbroek i = 0;
373*b636d99dSDavid van Moolenbroek } else
374*b636d99dSDavid van Moolenbroek i = j = k = 0;
375*b636d99dSDavid van Moolenbroek
376*b636d99dSDavid van Moolenbroek tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)];
377*b636d99dSDavid van Moolenbroek while (tp->e_nxt)
378*b636d99dSDavid van Moolenbroek if (tp->e_addr0 == i &&
379*b636d99dSDavid van Moolenbroek tp->e_addr1 == j &&
380*b636d99dSDavid van Moolenbroek tp->e_addr2 == k &&
381*b636d99dSDavid van Moolenbroek memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0)
382*b636d99dSDavid van Moolenbroek return tp;
383*b636d99dSDavid van Moolenbroek else
384*b636d99dSDavid van Moolenbroek tp = tp->e_nxt;
385*b636d99dSDavid van Moolenbroek
386*b636d99dSDavid van Moolenbroek tp->e_addr0 = i;
387*b636d99dSDavid van Moolenbroek tp->e_addr1 = j;
388*b636d99dSDavid van Moolenbroek tp->e_addr2 = k;
389*b636d99dSDavid van Moolenbroek
390*b636d99dSDavid van Moolenbroek tp->e_bs = (u_char *) calloc(1, nlen + 1);
391*b636d99dSDavid van Moolenbroek if (tp->e_bs == NULL)
392*b636d99dSDavid van Moolenbroek error("lookup_bytestring: calloc");
393*b636d99dSDavid van Moolenbroek
394*b636d99dSDavid van Moolenbroek memcpy(tp->e_bs, bs, nlen);
395*b636d99dSDavid van Moolenbroek tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
396*b636d99dSDavid van Moolenbroek if (tp->e_nxt == NULL)
397*b636d99dSDavid van Moolenbroek error("lookup_bytestring: calloc");
398*b636d99dSDavid van Moolenbroek
399*b636d99dSDavid van Moolenbroek return tp;
400*b636d99dSDavid van Moolenbroek }
401*b636d99dSDavid van Moolenbroek
402*b636d99dSDavid van Moolenbroek /* Find the hash node that corresponds the NSAP 'nsap' */
403*b636d99dSDavid van Moolenbroek
404*b636d99dSDavid van Moolenbroek static inline struct enamemem *
lookup_nsap(register const u_char * nsap)405*b636d99dSDavid van Moolenbroek lookup_nsap(register const u_char *nsap)
406*b636d99dSDavid van Moolenbroek {
407*b636d99dSDavid van Moolenbroek register u_int i, j, k;
408*b636d99dSDavid van Moolenbroek unsigned int nlen = *nsap;
409*b636d99dSDavid van Moolenbroek struct enamemem *tp;
410*b636d99dSDavid van Moolenbroek const u_char *ensap = nsap + nlen - 6;
411*b636d99dSDavid van Moolenbroek
412*b636d99dSDavid van Moolenbroek if (nlen > 6) {
413*b636d99dSDavid van Moolenbroek k = (ensap[0] << 8) | ensap[1];
414*b636d99dSDavid van Moolenbroek j = (ensap[2] << 8) | ensap[3];
415*b636d99dSDavid van Moolenbroek i = (ensap[4] << 8) | ensap[5];
416*b636d99dSDavid van Moolenbroek }
417*b636d99dSDavid van Moolenbroek else
418*b636d99dSDavid van Moolenbroek i = j = k = 0;
419*b636d99dSDavid van Moolenbroek
420*b636d99dSDavid van Moolenbroek tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)];
421*b636d99dSDavid van Moolenbroek while (tp->e_nxt)
422*b636d99dSDavid van Moolenbroek if (tp->e_addr0 == i &&
423*b636d99dSDavid van Moolenbroek tp->e_addr1 == j &&
424*b636d99dSDavid van Moolenbroek tp->e_addr2 == k &&
425*b636d99dSDavid van Moolenbroek tp->e_nsap[0] == nlen &&
426*b636d99dSDavid van Moolenbroek memcmp((const char *)&(nsap[1]),
427*b636d99dSDavid van Moolenbroek (char *)&(tp->e_nsap[1]), nlen) == 0)
428*b636d99dSDavid van Moolenbroek return tp;
429*b636d99dSDavid van Moolenbroek else
430*b636d99dSDavid van Moolenbroek tp = tp->e_nxt;
431*b636d99dSDavid van Moolenbroek tp->e_addr0 = i;
432*b636d99dSDavid van Moolenbroek tp->e_addr1 = j;
433*b636d99dSDavid van Moolenbroek tp->e_addr2 = k;
434*b636d99dSDavid van Moolenbroek tp->e_nsap = (u_char *)malloc(nlen + 1);
435*b636d99dSDavid van Moolenbroek if (tp->e_nsap == NULL)
436*b636d99dSDavid van Moolenbroek error("lookup_nsap: malloc");
437*b636d99dSDavid van Moolenbroek memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1);
438*b636d99dSDavid van Moolenbroek tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
439*b636d99dSDavid van Moolenbroek if (tp->e_nxt == NULL)
440*b636d99dSDavid van Moolenbroek error("lookup_nsap: calloc");
441*b636d99dSDavid van Moolenbroek
442*b636d99dSDavid van Moolenbroek return tp;
443*b636d99dSDavid van Moolenbroek }
444*b636d99dSDavid van Moolenbroek
445*b636d99dSDavid van Moolenbroek /* Find the hash node that corresponds the protoid 'pi'. */
446*b636d99dSDavid van Moolenbroek
447*b636d99dSDavid van Moolenbroek static inline struct protoidmem *
lookup_protoid(const u_char * pi)448*b636d99dSDavid van Moolenbroek lookup_protoid(const u_char *pi)
449*b636d99dSDavid van Moolenbroek {
450*b636d99dSDavid van Moolenbroek register u_int i, j;
451*b636d99dSDavid van Moolenbroek struct protoidmem *tp;
452*b636d99dSDavid van Moolenbroek
453*b636d99dSDavid van Moolenbroek /* 5 octets won't be aligned */
454*b636d99dSDavid van Moolenbroek i = (((pi[0] << 8) + pi[1]) << 8) + pi[2];
455*b636d99dSDavid van Moolenbroek j = (pi[3] << 8) + pi[4];
456*b636d99dSDavid van Moolenbroek /* XXX should be endian-insensitive, but do big-endian testing XXX */
457*b636d99dSDavid van Moolenbroek
458*b636d99dSDavid van Moolenbroek tp = &protoidtable[(i ^ j) & (HASHNAMESIZE-1)];
459*b636d99dSDavid van Moolenbroek while (tp->p_nxt)
460*b636d99dSDavid van Moolenbroek if (tp->p_oui == i && tp->p_proto == j)
461*b636d99dSDavid van Moolenbroek return tp;
462*b636d99dSDavid van Moolenbroek else
463*b636d99dSDavid van Moolenbroek tp = tp->p_nxt;
464*b636d99dSDavid van Moolenbroek tp->p_oui = i;
465*b636d99dSDavid van Moolenbroek tp->p_proto = j;
466*b636d99dSDavid van Moolenbroek tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
467*b636d99dSDavid van Moolenbroek if (tp->p_nxt == NULL)
468*b636d99dSDavid van Moolenbroek error("lookup_protoid: calloc");
469*b636d99dSDavid van Moolenbroek
470*b636d99dSDavid van Moolenbroek return tp;
471*b636d99dSDavid van Moolenbroek }
472*b636d99dSDavid van Moolenbroek
473*b636d99dSDavid van Moolenbroek const char *
etheraddr_string(netdissect_options * ndo,register const u_char * ep)474*b636d99dSDavid van Moolenbroek etheraddr_string(netdissect_options *ndo, register const u_char *ep)
475*b636d99dSDavid van Moolenbroek {
476*b636d99dSDavid van Moolenbroek register int i;
477*b636d99dSDavid van Moolenbroek register char *cp;
478*b636d99dSDavid van Moolenbroek register struct enamemem *tp;
479*b636d99dSDavid van Moolenbroek int oui;
480*b636d99dSDavid van Moolenbroek char buf[BUFSIZE];
481*b636d99dSDavid van Moolenbroek
482*b636d99dSDavid van Moolenbroek tp = lookup_emem(ep);
483*b636d99dSDavid van Moolenbroek if (tp->e_name)
484*b636d99dSDavid van Moolenbroek return (tp->e_name);
485*b636d99dSDavid van Moolenbroek #ifdef USE_ETHER_NTOHOST
486*b636d99dSDavid van Moolenbroek if (!ndo->ndo_nflag) {
487*b636d99dSDavid van Moolenbroek char buf2[BUFSIZE];
488*b636d99dSDavid van Moolenbroek
489*b636d99dSDavid van Moolenbroek /*
490*b636d99dSDavid van Moolenbroek * We don't cast it to "const struct ether_addr *"
491*b636d99dSDavid van Moolenbroek * because some systems fail to declare the second
492*b636d99dSDavid van Moolenbroek * argument as a "const" pointer, even though they
493*b636d99dSDavid van Moolenbroek * don't modify what it points to.
494*b636d99dSDavid van Moolenbroek */
495*b636d99dSDavid van Moolenbroek if (ether_ntohost(buf2, (struct ether_addr *)ep) == 0) {
496*b636d99dSDavid van Moolenbroek tp->e_name = strdup(buf2);
497*b636d99dSDavid van Moolenbroek return (tp->e_name);
498*b636d99dSDavid van Moolenbroek }
499*b636d99dSDavid van Moolenbroek }
500*b636d99dSDavid van Moolenbroek #endif
501*b636d99dSDavid van Moolenbroek cp = buf;
502*b636d99dSDavid van Moolenbroek oui = EXTRACT_24BITS(ep);
503*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep >> 4 ];
504*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep++ & 0xf];
505*b636d99dSDavid van Moolenbroek for (i = 5; --i >= 0;) {
506*b636d99dSDavid van Moolenbroek *cp++ = ':';
507*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep >> 4 ];
508*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep++ & 0xf];
509*b636d99dSDavid van Moolenbroek }
510*b636d99dSDavid van Moolenbroek
511*b636d99dSDavid van Moolenbroek if (!ndo->ndo_nflag) {
512*b636d99dSDavid van Moolenbroek snprintf(cp, BUFSIZE - (2 + 5*3), " (oui %s)",
513*b636d99dSDavid van Moolenbroek tok2str(oui_values, "Unknown", oui));
514*b636d99dSDavid van Moolenbroek } else
515*b636d99dSDavid van Moolenbroek *cp = '\0';
516*b636d99dSDavid van Moolenbroek tp->e_name = strdup(buf);
517*b636d99dSDavid van Moolenbroek return (tp->e_name);
518*b636d99dSDavid van Moolenbroek }
519*b636d99dSDavid van Moolenbroek
520*b636d99dSDavid van Moolenbroek const char *
le64addr_string(const u_char * ep)521*b636d99dSDavid van Moolenbroek le64addr_string(const u_char *ep)
522*b636d99dSDavid van Moolenbroek {
523*b636d99dSDavid van Moolenbroek const unsigned int len = 8;
524*b636d99dSDavid van Moolenbroek register u_int i;
525*b636d99dSDavid van Moolenbroek register char *cp;
526*b636d99dSDavid van Moolenbroek register struct enamemem *tp;
527*b636d99dSDavid van Moolenbroek char buf[BUFSIZE];
528*b636d99dSDavid van Moolenbroek
529*b636d99dSDavid van Moolenbroek tp = lookup_bytestring(ep, len);
530*b636d99dSDavid van Moolenbroek if (tp->e_name)
531*b636d99dSDavid van Moolenbroek return (tp->e_name);
532*b636d99dSDavid van Moolenbroek
533*b636d99dSDavid van Moolenbroek cp = buf;
534*b636d99dSDavid van Moolenbroek for (i = len; i > 0 ; --i) {
535*b636d99dSDavid van Moolenbroek *cp++ = hex[*(ep + i - 1) >> 4];
536*b636d99dSDavid van Moolenbroek *cp++ = hex[*(ep + i - 1) & 0xf];
537*b636d99dSDavid van Moolenbroek *cp++ = ':';
538*b636d99dSDavid van Moolenbroek }
539*b636d99dSDavid van Moolenbroek cp --;
540*b636d99dSDavid van Moolenbroek
541*b636d99dSDavid van Moolenbroek *cp = '\0';
542*b636d99dSDavid van Moolenbroek
543*b636d99dSDavid van Moolenbroek tp->e_name = strdup(buf);
544*b636d99dSDavid van Moolenbroek
545*b636d99dSDavid van Moolenbroek return (tp->e_name);
546*b636d99dSDavid van Moolenbroek }
547*b636d99dSDavid van Moolenbroek
548*b636d99dSDavid van Moolenbroek const char *
linkaddr_string(netdissect_options * ndo,const u_char * ep,const unsigned int type,const unsigned int len)549*b636d99dSDavid van Moolenbroek linkaddr_string(netdissect_options *ndo, const u_char *ep, const unsigned int type, const unsigned int len)
550*b636d99dSDavid van Moolenbroek {
551*b636d99dSDavid van Moolenbroek register u_int i;
552*b636d99dSDavid van Moolenbroek register char *cp;
553*b636d99dSDavid van Moolenbroek register struct enamemem *tp;
554*b636d99dSDavid van Moolenbroek
555*b636d99dSDavid van Moolenbroek if (len == 0)
556*b636d99dSDavid van Moolenbroek return ("<empty>");
557*b636d99dSDavid van Moolenbroek
558*b636d99dSDavid van Moolenbroek if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN)
559*b636d99dSDavid van Moolenbroek return (etheraddr_string(ndo, ep));
560*b636d99dSDavid van Moolenbroek
561*b636d99dSDavid van Moolenbroek if (type == LINKADDR_FRELAY)
562*b636d99dSDavid van Moolenbroek return (q922_string(ndo, ep, len));
563*b636d99dSDavid van Moolenbroek
564*b636d99dSDavid van Moolenbroek tp = lookup_bytestring(ep, len);
565*b636d99dSDavid van Moolenbroek if (tp->e_name)
566*b636d99dSDavid van Moolenbroek return (tp->e_name);
567*b636d99dSDavid van Moolenbroek
568*b636d99dSDavid van Moolenbroek tp->e_name = cp = (char *)malloc(len*3);
569*b636d99dSDavid van Moolenbroek if (tp->e_name == NULL)
570*b636d99dSDavid van Moolenbroek error("linkaddr_string: malloc");
571*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep >> 4];
572*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep++ & 0xf];
573*b636d99dSDavid van Moolenbroek for (i = len-1; i > 0 ; --i) {
574*b636d99dSDavid van Moolenbroek *cp++ = ':';
575*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep >> 4];
576*b636d99dSDavid van Moolenbroek *cp++ = hex[*ep++ & 0xf];
577*b636d99dSDavid van Moolenbroek }
578*b636d99dSDavid van Moolenbroek *cp = '\0';
579*b636d99dSDavid van Moolenbroek return (tp->e_name);
580*b636d99dSDavid van Moolenbroek }
581*b636d99dSDavid van Moolenbroek
582*b636d99dSDavid van Moolenbroek const char *
etherproto_string(u_short port)583*b636d99dSDavid van Moolenbroek etherproto_string(u_short port)
584*b636d99dSDavid van Moolenbroek {
585*b636d99dSDavid van Moolenbroek register char *cp;
586*b636d99dSDavid van Moolenbroek register struct hnamemem *tp;
587*b636d99dSDavid van Moolenbroek register uint32_t i = port;
588*b636d99dSDavid van Moolenbroek char buf[sizeof("0000")];
589*b636d99dSDavid van Moolenbroek
590*b636d99dSDavid van Moolenbroek for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
591*b636d99dSDavid van Moolenbroek if (tp->addr == i)
592*b636d99dSDavid van Moolenbroek return (tp->name);
593*b636d99dSDavid van Moolenbroek
594*b636d99dSDavid van Moolenbroek tp->addr = i;
595*b636d99dSDavid van Moolenbroek tp->nxt = newhnamemem();
596*b636d99dSDavid van Moolenbroek
597*b636d99dSDavid van Moolenbroek cp = buf;
598*b636d99dSDavid van Moolenbroek NTOHS(port);
599*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 12 & 0xf];
600*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 8 & 0xf];
601*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 4 & 0xf];
602*b636d99dSDavid van Moolenbroek *cp++ = hex[port & 0xf];
603*b636d99dSDavid van Moolenbroek *cp++ = '\0';
604*b636d99dSDavid van Moolenbroek tp->name = strdup(buf);
605*b636d99dSDavid van Moolenbroek return (tp->name);
606*b636d99dSDavid van Moolenbroek }
607*b636d99dSDavid van Moolenbroek
608*b636d99dSDavid van Moolenbroek const char *
protoid_string(register const u_char * pi)609*b636d99dSDavid van Moolenbroek protoid_string(register const u_char *pi)
610*b636d99dSDavid van Moolenbroek {
611*b636d99dSDavid van Moolenbroek register u_int i, j;
612*b636d99dSDavid van Moolenbroek register char *cp;
613*b636d99dSDavid van Moolenbroek register struct protoidmem *tp;
614*b636d99dSDavid van Moolenbroek char buf[sizeof("00:00:00:00:00")];
615*b636d99dSDavid van Moolenbroek
616*b636d99dSDavid van Moolenbroek tp = lookup_protoid(pi);
617*b636d99dSDavid van Moolenbroek if (tp->p_name)
618*b636d99dSDavid van Moolenbroek return tp->p_name;
619*b636d99dSDavid van Moolenbroek
620*b636d99dSDavid van Moolenbroek cp = buf;
621*b636d99dSDavid van Moolenbroek if ((j = *pi >> 4) != 0)
622*b636d99dSDavid van Moolenbroek *cp++ = hex[j];
623*b636d99dSDavid van Moolenbroek *cp++ = hex[*pi++ & 0xf];
624*b636d99dSDavid van Moolenbroek for (i = 4; (int)--i >= 0;) {
625*b636d99dSDavid van Moolenbroek *cp++ = ':';
626*b636d99dSDavid van Moolenbroek if ((j = *pi >> 4) != 0)
627*b636d99dSDavid van Moolenbroek *cp++ = hex[j];
628*b636d99dSDavid van Moolenbroek *cp++ = hex[*pi++ & 0xf];
629*b636d99dSDavid van Moolenbroek }
630*b636d99dSDavid van Moolenbroek *cp = '\0';
631*b636d99dSDavid van Moolenbroek tp->p_name = strdup(buf);
632*b636d99dSDavid van Moolenbroek return (tp->p_name);
633*b636d99dSDavid van Moolenbroek }
634*b636d99dSDavid van Moolenbroek
635*b636d99dSDavid van Moolenbroek #define ISONSAP_MAX_LENGTH 20
636*b636d99dSDavid van Moolenbroek const char *
isonsap_string(const u_char * nsap,register u_int nsap_length)637*b636d99dSDavid van Moolenbroek isonsap_string(const u_char *nsap, register u_int nsap_length)
638*b636d99dSDavid van Moolenbroek {
639*b636d99dSDavid van Moolenbroek register u_int nsap_idx;
640*b636d99dSDavid van Moolenbroek register char *cp;
641*b636d99dSDavid van Moolenbroek register struct enamemem *tp;
642*b636d99dSDavid van Moolenbroek
643*b636d99dSDavid van Moolenbroek if (nsap_length < 1 || nsap_length > ISONSAP_MAX_LENGTH)
644*b636d99dSDavid van Moolenbroek return ("isonsap_string: illegal length");
645*b636d99dSDavid van Moolenbroek
646*b636d99dSDavid van Moolenbroek tp = lookup_nsap(nsap);
647*b636d99dSDavid van Moolenbroek if (tp->e_name)
648*b636d99dSDavid van Moolenbroek return tp->e_name;
649*b636d99dSDavid van Moolenbroek
650*b636d99dSDavid van Moolenbroek tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx"));
651*b636d99dSDavid van Moolenbroek if (cp == NULL)
652*b636d99dSDavid van Moolenbroek error("isonsap_string: malloc");
653*b636d99dSDavid van Moolenbroek
654*b636d99dSDavid van Moolenbroek for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) {
655*b636d99dSDavid van Moolenbroek *cp++ = hex[*nsap >> 4];
656*b636d99dSDavid van Moolenbroek *cp++ = hex[*nsap++ & 0xf];
657*b636d99dSDavid van Moolenbroek if (((nsap_idx & 1) == 0) &&
658*b636d99dSDavid van Moolenbroek (nsap_idx + 1 < nsap_length)) {
659*b636d99dSDavid van Moolenbroek *cp++ = '.';
660*b636d99dSDavid van Moolenbroek }
661*b636d99dSDavid van Moolenbroek }
662*b636d99dSDavid van Moolenbroek *cp = '\0';
663*b636d99dSDavid van Moolenbroek return (tp->e_name);
664*b636d99dSDavid van Moolenbroek }
665*b636d99dSDavid van Moolenbroek
666*b636d99dSDavid van Moolenbroek const char *
tcpport_string(u_short port)667*b636d99dSDavid van Moolenbroek tcpport_string(u_short port)
668*b636d99dSDavid van Moolenbroek {
669*b636d99dSDavid van Moolenbroek register struct hnamemem *tp;
670*b636d99dSDavid van Moolenbroek register uint32_t i = port;
671*b636d99dSDavid van Moolenbroek char buf[sizeof("00000")];
672*b636d99dSDavid van Moolenbroek
673*b636d99dSDavid van Moolenbroek for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
674*b636d99dSDavid van Moolenbroek if (tp->addr == i)
675*b636d99dSDavid van Moolenbroek return (tp->name);
676*b636d99dSDavid van Moolenbroek
677*b636d99dSDavid van Moolenbroek tp->addr = i;
678*b636d99dSDavid van Moolenbroek tp->nxt = newhnamemem();
679*b636d99dSDavid van Moolenbroek
680*b636d99dSDavid van Moolenbroek (void)snprintf(buf, sizeof(buf), "%u", i);
681*b636d99dSDavid van Moolenbroek tp->name = strdup(buf);
682*b636d99dSDavid van Moolenbroek return (tp->name);
683*b636d99dSDavid van Moolenbroek }
684*b636d99dSDavid van Moolenbroek
685*b636d99dSDavid van Moolenbroek const char *
udpport_string(register u_short port)686*b636d99dSDavid van Moolenbroek udpport_string(register u_short port)
687*b636d99dSDavid van Moolenbroek {
688*b636d99dSDavid van Moolenbroek register struct hnamemem *tp;
689*b636d99dSDavid van Moolenbroek register uint32_t i = port;
690*b636d99dSDavid van Moolenbroek char buf[sizeof("00000")];
691*b636d99dSDavid van Moolenbroek
692*b636d99dSDavid van Moolenbroek for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
693*b636d99dSDavid van Moolenbroek if (tp->addr == i)
694*b636d99dSDavid van Moolenbroek return (tp->name);
695*b636d99dSDavid van Moolenbroek
696*b636d99dSDavid van Moolenbroek tp->addr = i;
697*b636d99dSDavid van Moolenbroek tp->nxt = newhnamemem();
698*b636d99dSDavid van Moolenbroek
699*b636d99dSDavid van Moolenbroek (void)snprintf(buf, sizeof(buf), "%u", i);
700*b636d99dSDavid van Moolenbroek tp->name = strdup(buf);
701*b636d99dSDavid van Moolenbroek return (tp->name);
702*b636d99dSDavid van Moolenbroek }
703*b636d99dSDavid van Moolenbroek
704*b636d99dSDavid van Moolenbroek const char *
ipxsap_string(u_short port)705*b636d99dSDavid van Moolenbroek ipxsap_string(u_short port)
706*b636d99dSDavid van Moolenbroek {
707*b636d99dSDavid van Moolenbroek register char *cp;
708*b636d99dSDavid van Moolenbroek register struct hnamemem *tp;
709*b636d99dSDavid van Moolenbroek register uint32_t i = port;
710*b636d99dSDavid van Moolenbroek char buf[sizeof("0000")];
711*b636d99dSDavid van Moolenbroek
712*b636d99dSDavid van Moolenbroek for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)
713*b636d99dSDavid van Moolenbroek if (tp->addr == i)
714*b636d99dSDavid van Moolenbroek return (tp->name);
715*b636d99dSDavid van Moolenbroek
716*b636d99dSDavid van Moolenbroek tp->addr = i;
717*b636d99dSDavid van Moolenbroek tp->nxt = newhnamemem();
718*b636d99dSDavid van Moolenbroek
719*b636d99dSDavid van Moolenbroek cp = buf;
720*b636d99dSDavid van Moolenbroek NTOHS(port);
721*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 12 & 0xf];
722*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 8 & 0xf];
723*b636d99dSDavid van Moolenbroek *cp++ = hex[port >> 4 & 0xf];
724*b636d99dSDavid van Moolenbroek *cp++ = hex[port & 0xf];
725*b636d99dSDavid van Moolenbroek *cp++ = '\0';
726*b636d99dSDavid van Moolenbroek tp->name = strdup(buf);
727*b636d99dSDavid van Moolenbroek return (tp->name);
728*b636d99dSDavid van Moolenbroek }
729*b636d99dSDavid van Moolenbroek
730*b636d99dSDavid van Moolenbroek static void
init_servarray(netdissect_options * ndo)731*b636d99dSDavid van Moolenbroek init_servarray(netdissect_options *ndo)
732*b636d99dSDavid van Moolenbroek {
733*b636d99dSDavid van Moolenbroek struct servent *sv;
734*b636d99dSDavid van Moolenbroek register struct hnamemem *table;
735*b636d99dSDavid van Moolenbroek register int i;
736*b636d99dSDavid van Moolenbroek char buf[sizeof("0000000000")];
737*b636d99dSDavid van Moolenbroek
738*b636d99dSDavid van Moolenbroek while ((sv = getservent()) != NULL) {
739*b636d99dSDavid van Moolenbroek int port = ntohs(sv->s_port);
740*b636d99dSDavid van Moolenbroek i = port & (HASHNAMESIZE-1);
741*b636d99dSDavid van Moolenbroek if (strcmp(sv->s_proto, "tcp") == 0)
742*b636d99dSDavid van Moolenbroek table = &tporttable[i];
743*b636d99dSDavid van Moolenbroek else if (strcmp(sv->s_proto, "udp") == 0)
744*b636d99dSDavid van Moolenbroek table = &uporttable[i];
745*b636d99dSDavid van Moolenbroek else
746*b636d99dSDavid van Moolenbroek continue;
747*b636d99dSDavid van Moolenbroek
748*b636d99dSDavid van Moolenbroek while (table->name)
749*b636d99dSDavid van Moolenbroek table = table->nxt;
750*b636d99dSDavid van Moolenbroek if (ndo->ndo_nflag) {
751*b636d99dSDavid van Moolenbroek (void)snprintf(buf, sizeof(buf), "%d", port);
752*b636d99dSDavid van Moolenbroek table->name = strdup(buf);
753*b636d99dSDavid van Moolenbroek } else
754*b636d99dSDavid van Moolenbroek table->name = strdup(sv->s_name);
755*b636d99dSDavid van Moolenbroek table->addr = port;
756*b636d99dSDavid van Moolenbroek table->nxt = newhnamemem();
757*b636d99dSDavid van Moolenbroek }
758*b636d99dSDavid van Moolenbroek endservent();
759*b636d99dSDavid van Moolenbroek }
760*b636d99dSDavid van Moolenbroek
761*b636d99dSDavid van Moolenbroek /* in libpcap.a (nametoaddr.c) */
762*b636d99dSDavid van Moolenbroek #if defined(WIN32) && !defined(USE_STATIC_LIBPCAP)
763*b636d99dSDavid van Moolenbroek extern __declspec(dllimport)
764*b636d99dSDavid van Moolenbroek #else
765*b636d99dSDavid van Moolenbroek extern
766*b636d99dSDavid van Moolenbroek #endif
767*b636d99dSDavid van Moolenbroek const struct eproto {
768*b636d99dSDavid van Moolenbroek const char *s;
769*b636d99dSDavid van Moolenbroek u_short p;
770*b636d99dSDavid van Moolenbroek } eproto_db[];
771*b636d99dSDavid van Moolenbroek
772*b636d99dSDavid van Moolenbroek static void
init_eprotoarray(void)773*b636d99dSDavid van Moolenbroek init_eprotoarray(void)
774*b636d99dSDavid van Moolenbroek {
775*b636d99dSDavid van Moolenbroek register int i;
776*b636d99dSDavid van Moolenbroek register struct hnamemem *table;
777*b636d99dSDavid van Moolenbroek
778*b636d99dSDavid van Moolenbroek for (i = 0; eproto_db[i].s; i++) {
779*b636d99dSDavid van Moolenbroek int j = htons(eproto_db[i].p) & (HASHNAMESIZE-1);
780*b636d99dSDavid van Moolenbroek table = &eprototable[j];
781*b636d99dSDavid van Moolenbroek while (table->name)
782*b636d99dSDavid van Moolenbroek table = table->nxt;
783*b636d99dSDavid van Moolenbroek table->name = eproto_db[i].s;
784*b636d99dSDavid van Moolenbroek table->addr = htons(eproto_db[i].p);
785*b636d99dSDavid van Moolenbroek table->nxt = newhnamemem();
786*b636d99dSDavid van Moolenbroek }
787*b636d99dSDavid van Moolenbroek }
788*b636d99dSDavid van Moolenbroek
789*b636d99dSDavid van Moolenbroek static const struct protoidlist {
790*b636d99dSDavid van Moolenbroek const u_char protoid[5];
791*b636d99dSDavid van Moolenbroek const char *name;
792*b636d99dSDavid van Moolenbroek } protoidlist[] = {
793*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" },
794*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" },
795*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" },
796*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" },
797*b636d99dSDavid van Moolenbroek {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" },
798*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
799*b636d99dSDavid van Moolenbroek };
800*b636d99dSDavid van Moolenbroek
801*b636d99dSDavid van Moolenbroek /*
802*b636d99dSDavid van Moolenbroek * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet
803*b636d99dSDavid van Moolenbroek * types.
804*b636d99dSDavid van Moolenbroek */
805*b636d99dSDavid van Moolenbroek static void
init_protoidarray(void)806*b636d99dSDavid van Moolenbroek init_protoidarray(void)
807*b636d99dSDavid van Moolenbroek {
808*b636d99dSDavid van Moolenbroek register int i;
809*b636d99dSDavid van Moolenbroek register struct protoidmem *tp;
810*b636d99dSDavid van Moolenbroek const struct protoidlist *pl;
811*b636d99dSDavid van Moolenbroek u_char protoid[5];
812*b636d99dSDavid van Moolenbroek
813*b636d99dSDavid van Moolenbroek protoid[0] = 0;
814*b636d99dSDavid van Moolenbroek protoid[1] = 0;
815*b636d99dSDavid van Moolenbroek protoid[2] = 0;
816*b636d99dSDavid van Moolenbroek for (i = 0; eproto_db[i].s; i++) {
817*b636d99dSDavid van Moolenbroek u_short etype = htons(eproto_db[i].p);
818*b636d99dSDavid van Moolenbroek
819*b636d99dSDavid van Moolenbroek memcpy((char *)&protoid[3], (char *)&etype, 2);
820*b636d99dSDavid van Moolenbroek tp = lookup_protoid(protoid);
821*b636d99dSDavid van Moolenbroek tp->p_name = strdup(eproto_db[i].s);
822*b636d99dSDavid van Moolenbroek }
823*b636d99dSDavid van Moolenbroek /* Hardwire some SNAP proto ID names */
824*b636d99dSDavid van Moolenbroek for (pl = protoidlist; pl->name != NULL; ++pl) {
825*b636d99dSDavid van Moolenbroek tp = lookup_protoid(pl->protoid);
826*b636d99dSDavid van Moolenbroek /* Don't override existing name */
827*b636d99dSDavid van Moolenbroek if (tp->p_name != NULL)
828*b636d99dSDavid van Moolenbroek continue;
829*b636d99dSDavid van Moolenbroek
830*b636d99dSDavid van Moolenbroek tp->p_name = pl->name;
831*b636d99dSDavid van Moolenbroek }
832*b636d99dSDavid van Moolenbroek }
833*b636d99dSDavid van Moolenbroek
834*b636d99dSDavid van Moolenbroek static const struct etherlist {
835*b636d99dSDavid van Moolenbroek const u_char addr[6];
836*b636d99dSDavid van Moolenbroek const char *name;
837*b636d99dSDavid van Moolenbroek } etherlist[] = {
838*b636d99dSDavid van Moolenbroek {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "Broadcast" },
839*b636d99dSDavid van Moolenbroek {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
840*b636d99dSDavid van Moolenbroek };
841*b636d99dSDavid van Moolenbroek
842*b636d99dSDavid van Moolenbroek /*
843*b636d99dSDavid van Moolenbroek * Initialize the ethers hash table. We take two different approaches
844*b636d99dSDavid van Moolenbroek * depending on whether or not the system provides the ethers name
845*b636d99dSDavid van Moolenbroek * service. If it does, we just wire in a few names at startup,
846*b636d99dSDavid van Moolenbroek * and etheraddr_string() fills in the table on demand. If it doesn't,
847*b636d99dSDavid van Moolenbroek * then we suck in the entire /etc/ethers file at startup. The idea
848*b636d99dSDavid van Moolenbroek * is that parsing the local file will be fast, but spinning through
849*b636d99dSDavid van Moolenbroek * all the ethers entries via NIS & next_etherent might be very slow.
850*b636d99dSDavid van Moolenbroek *
851*b636d99dSDavid van Moolenbroek * XXX pcap_next_etherent doesn't belong in the pcap interface, but
852*b636d99dSDavid van Moolenbroek * since the pcap module already does name-to-address translation,
853*b636d99dSDavid van Moolenbroek * it's already does most of the work for the ethernet address-to-name
854*b636d99dSDavid van Moolenbroek * translation, so we just pcap_next_etherent as a convenience.
855*b636d99dSDavid van Moolenbroek */
856*b636d99dSDavid van Moolenbroek static void
init_etherarray(void)857*b636d99dSDavid van Moolenbroek init_etherarray(void)
858*b636d99dSDavid van Moolenbroek {
859*b636d99dSDavid van Moolenbroek register const struct etherlist *el;
860*b636d99dSDavid van Moolenbroek register struct enamemem *tp;
861*b636d99dSDavid van Moolenbroek #ifdef USE_ETHER_NTOHOST
862*b636d99dSDavid van Moolenbroek char name[256];
863*b636d99dSDavid van Moolenbroek #else
864*b636d99dSDavid van Moolenbroek register struct pcap_etherent *ep;
865*b636d99dSDavid van Moolenbroek register FILE *fp;
866*b636d99dSDavid van Moolenbroek
867*b636d99dSDavid van Moolenbroek /* Suck in entire ethers file */
868*b636d99dSDavid van Moolenbroek fp = fopen(PCAP_ETHERS_FILE, "r");
869*b636d99dSDavid van Moolenbroek if (fp != NULL) {
870*b636d99dSDavid van Moolenbroek while ((ep = pcap_next_etherent(fp)) != NULL) {
871*b636d99dSDavid van Moolenbroek tp = lookup_emem(ep->addr);
872*b636d99dSDavid van Moolenbroek tp->e_name = strdup(ep->name);
873*b636d99dSDavid van Moolenbroek }
874*b636d99dSDavid van Moolenbroek (void)fclose(fp);
875*b636d99dSDavid van Moolenbroek }
876*b636d99dSDavid van Moolenbroek #endif
877*b636d99dSDavid van Moolenbroek
878*b636d99dSDavid van Moolenbroek /* Hardwire some ethernet names */
879*b636d99dSDavid van Moolenbroek for (el = etherlist; el->name != NULL; ++el) {
880*b636d99dSDavid van Moolenbroek tp = lookup_emem(el->addr);
881*b636d99dSDavid van Moolenbroek /* Don't override existing name */
882*b636d99dSDavid van Moolenbroek if (tp->e_name != NULL)
883*b636d99dSDavid van Moolenbroek continue;
884*b636d99dSDavid van Moolenbroek
885*b636d99dSDavid van Moolenbroek #ifdef USE_ETHER_NTOHOST
886*b636d99dSDavid van Moolenbroek /*
887*b636d99dSDavid van Moolenbroek * Use YP/NIS version of name if available.
888*b636d99dSDavid van Moolenbroek *
889*b636d99dSDavid van Moolenbroek * We don't cast it to "const struct ether_addr *"
890*b636d99dSDavid van Moolenbroek * because some systems don't modify the Ethernet
891*b636d99dSDavid van Moolenbroek * address but fail to declare the second argument
892*b636d99dSDavid van Moolenbroek * as a "const" pointer.
893*b636d99dSDavid van Moolenbroek */
894*b636d99dSDavid van Moolenbroek if (ether_ntohost(name, (struct ether_addr *)el->addr) == 0) {
895*b636d99dSDavid van Moolenbroek tp->e_name = strdup(name);
896*b636d99dSDavid van Moolenbroek continue;
897*b636d99dSDavid van Moolenbroek }
898*b636d99dSDavid van Moolenbroek #endif
899*b636d99dSDavid van Moolenbroek tp->e_name = el->name;
900*b636d99dSDavid van Moolenbroek }
901*b636d99dSDavid van Moolenbroek }
902*b636d99dSDavid van Moolenbroek
903*b636d99dSDavid van Moolenbroek static const struct tok ipxsap_db[] = {
904*b636d99dSDavid van Moolenbroek { 0x0000, "Unknown" },
905*b636d99dSDavid van Moolenbroek { 0x0001, "User" },
906*b636d99dSDavid van Moolenbroek { 0x0002, "User Group" },
907*b636d99dSDavid van Moolenbroek { 0x0003, "PrintQueue" },
908*b636d99dSDavid van Moolenbroek { 0x0004, "FileServer" },
909*b636d99dSDavid van Moolenbroek { 0x0005, "JobServer" },
910*b636d99dSDavid van Moolenbroek { 0x0006, "Gateway" },
911*b636d99dSDavid van Moolenbroek { 0x0007, "PrintServer" },
912*b636d99dSDavid van Moolenbroek { 0x0008, "ArchiveQueue" },
913*b636d99dSDavid van Moolenbroek { 0x0009, "ArchiveServer" },
914*b636d99dSDavid van Moolenbroek { 0x000a, "JobQueue" },
915*b636d99dSDavid van Moolenbroek { 0x000b, "Administration" },
916*b636d99dSDavid van Moolenbroek { 0x000F, "Novell TI-RPC" },
917*b636d99dSDavid van Moolenbroek { 0x0017, "Diagnostics" },
918*b636d99dSDavid van Moolenbroek { 0x0020, "NetBIOS" },
919*b636d99dSDavid van Moolenbroek { 0x0021, "NAS SNA Gateway" },
920*b636d99dSDavid van Moolenbroek { 0x0023, "NACS AsyncGateway" },
921*b636d99dSDavid van Moolenbroek { 0x0024, "RemoteBridge/RoutingService" },
922*b636d99dSDavid van Moolenbroek { 0x0026, "BridgeServer" },
923*b636d99dSDavid van Moolenbroek { 0x0027, "TCP/IP Gateway" },
924*b636d99dSDavid van Moolenbroek { 0x0028, "Point-to-point X.25 BridgeServer" },
925*b636d99dSDavid van Moolenbroek { 0x0029, "3270 Gateway" },
926*b636d99dSDavid van Moolenbroek { 0x002a, "CHI Corp" },
927*b636d99dSDavid van Moolenbroek { 0x002c, "PC Chalkboard" },
928*b636d99dSDavid van Moolenbroek { 0x002d, "TimeSynchServer" },
929*b636d99dSDavid van Moolenbroek { 0x002e, "ARCserve5.0/PalindromeBackup" },
930*b636d99dSDavid van Moolenbroek { 0x0045, "DI3270 Gateway" },
931*b636d99dSDavid van Moolenbroek { 0x0047, "AdvertisingPrintServer" },
932*b636d99dSDavid van Moolenbroek { 0x004a, "NetBlazerModems" },
933*b636d99dSDavid van Moolenbroek { 0x004b, "BtrieveVAP" },
934*b636d99dSDavid van Moolenbroek { 0x004c, "NetwareSQL" },
935*b636d99dSDavid van Moolenbroek { 0x004d, "XtreeNetwork" },
936*b636d99dSDavid van Moolenbroek { 0x0050, "BtrieveVAP4.11" },
937*b636d99dSDavid van Moolenbroek { 0x0052, "QuickLink" },
938*b636d99dSDavid van Moolenbroek { 0x0053, "PrintQueueUser" },
939*b636d99dSDavid van Moolenbroek { 0x0058, "Multipoint X.25 Router" },
940*b636d99dSDavid van Moolenbroek { 0x0060, "STLB/NLM" },
941*b636d99dSDavid van Moolenbroek { 0x0064, "ARCserve" },
942*b636d99dSDavid van Moolenbroek { 0x0066, "ARCserve3.0" },
943*b636d99dSDavid van Moolenbroek { 0x0072, "WAN CopyUtility" },
944*b636d99dSDavid van Moolenbroek { 0x007a, "TES-NetwareVMS" },
945*b636d99dSDavid van Moolenbroek { 0x0092, "WATCOM Debugger/EmeraldTapeBackupServer" },
946*b636d99dSDavid van Moolenbroek { 0x0095, "DDA OBGYN" },
947*b636d99dSDavid van Moolenbroek { 0x0098, "NetwareAccessServer" },
948*b636d99dSDavid van Moolenbroek { 0x009a, "Netware for VMS II/NamedPipeServer" },
949*b636d99dSDavid van Moolenbroek { 0x009b, "NetwareAccessServer" },
950*b636d99dSDavid van Moolenbroek { 0x009e, "PortableNetwareServer/SunLinkNVT" },
951*b636d99dSDavid van Moolenbroek { 0x00a1, "PowerchuteAPC UPS" },
952*b636d99dSDavid van Moolenbroek { 0x00aa, "LAWserve" },
953*b636d99dSDavid van Moolenbroek { 0x00ac, "CompaqIDA StatusMonitor" },
954*b636d99dSDavid van Moolenbroek { 0x0100, "PIPE STAIL" },
955*b636d99dSDavid van Moolenbroek { 0x0102, "LAN ProtectBindery" },
956*b636d99dSDavid van Moolenbroek { 0x0103, "OracleDataBaseServer" },
957*b636d99dSDavid van Moolenbroek { 0x0107, "Netware386/RSPX RemoteConsole" },
958*b636d99dSDavid van Moolenbroek { 0x010f, "NovellSNA Gateway" },
959*b636d99dSDavid van Moolenbroek { 0x0111, "TestServer" },
960*b636d99dSDavid van Moolenbroek { 0x0112, "HP PrintServer" },
961*b636d99dSDavid van Moolenbroek { 0x0114, "CSA MUX" },
962*b636d99dSDavid van Moolenbroek { 0x0115, "CSA LCA" },
963*b636d99dSDavid van Moolenbroek { 0x0116, "CSA CM" },
964*b636d99dSDavid van Moolenbroek { 0x0117, "CSA SMA" },
965*b636d99dSDavid van Moolenbroek { 0x0118, "CSA DBA" },
966*b636d99dSDavid van Moolenbroek { 0x0119, "CSA NMA" },
967*b636d99dSDavid van Moolenbroek { 0x011a, "CSA SSA" },
968*b636d99dSDavid van Moolenbroek { 0x011b, "CSA STATUS" },
969*b636d99dSDavid van Moolenbroek { 0x011e, "CSA APPC" },
970*b636d99dSDavid van Moolenbroek { 0x0126, "SNA TEST SSA Profile" },
971*b636d99dSDavid van Moolenbroek { 0x012a, "CSA TRACE" },
972*b636d99dSDavid van Moolenbroek { 0x012b, "NetwareSAA" },
973*b636d99dSDavid van Moolenbroek { 0x012e, "IKARUS VirusScan" },
974*b636d99dSDavid van Moolenbroek { 0x0130, "CommunicationsExecutive" },
975*b636d99dSDavid van Moolenbroek { 0x0133, "NNS DomainServer/NetwareNamingServicesDomain" },
976*b636d99dSDavid van Moolenbroek { 0x0135, "NetwareNamingServicesProfile" },
977*b636d99dSDavid van Moolenbroek { 0x0137, "Netware386 PrintQueue/NNS PrintQueue" },
978*b636d99dSDavid van Moolenbroek { 0x0141, "LAN SpoolServer" },
979*b636d99dSDavid van Moolenbroek { 0x0152, "IRMALAN Gateway" },
980*b636d99dSDavid van Moolenbroek { 0x0154, "NamedPipeServer" },
981*b636d99dSDavid van Moolenbroek { 0x0166, "NetWareManagement" },
982*b636d99dSDavid van Moolenbroek { 0x0168, "Intel PICKIT CommServer/Intel CAS TalkServer" },
983*b636d99dSDavid van Moolenbroek { 0x0173, "Compaq" },
984*b636d99dSDavid van Moolenbroek { 0x0174, "Compaq SNMP Agent" },
985*b636d99dSDavid van Moolenbroek { 0x0175, "Compaq" },
986*b636d99dSDavid van Moolenbroek { 0x0180, "XTreeServer/XTreeTools" },
987*b636d99dSDavid van Moolenbroek { 0x018A, "NASI ServicesBroadcastServer" },
988*b636d99dSDavid van Moolenbroek { 0x01b0, "GARP Gateway" },
989*b636d99dSDavid van Moolenbroek { 0x01b1, "Binfview" },
990*b636d99dSDavid van Moolenbroek { 0x01bf, "IntelLanDeskManager" },
991*b636d99dSDavid van Moolenbroek { 0x01ca, "AXTEC" },
992*b636d99dSDavid van Moolenbroek { 0x01cb, "ShivaNetModem/E" },
993*b636d99dSDavid van Moolenbroek { 0x01cc, "ShivaLanRover/E" },
994*b636d99dSDavid van Moolenbroek { 0x01cd, "ShivaLanRover/T" },
995*b636d99dSDavid van Moolenbroek { 0x01ce, "ShivaUniversal" },
996*b636d99dSDavid van Moolenbroek { 0x01d8, "CastelleFAXPressServer" },
997*b636d99dSDavid van Moolenbroek { 0x01da, "CastelleLANPressPrintServer" },
998*b636d99dSDavid van Moolenbroek { 0x01dc, "CastelleFAX/Xerox7033 FaxServer/ExcelLanFax" },
999*b636d99dSDavid van Moolenbroek { 0x01f0, "LEGATO" },
1000*b636d99dSDavid van Moolenbroek { 0x01f5, "LEGATO" },
1001*b636d99dSDavid van Moolenbroek { 0x0233, "NMS Agent/NetwareManagementAgent" },
1002*b636d99dSDavid van Moolenbroek { 0x0237, "NMS IPX Discovery/LANternReadWriteChannel" },
1003*b636d99dSDavid van Moolenbroek { 0x0238, "NMS IP Discovery/LANternTrapAlarmChannel" },
1004*b636d99dSDavid van Moolenbroek { 0x023a, "LANtern" },
1005*b636d99dSDavid van Moolenbroek { 0x023c, "MAVERICK" },
1006*b636d99dSDavid van Moolenbroek { 0x023f, "NovellSMDR" },
1007*b636d99dSDavid van Moolenbroek { 0x024e, "NetwareConnect" },
1008*b636d99dSDavid van Moolenbroek { 0x024f, "NASI ServerBroadcast Cisco" },
1009*b636d99dSDavid van Moolenbroek { 0x026a, "NMS ServiceConsole" },
1010*b636d99dSDavid van Moolenbroek { 0x026b, "TimeSynchronizationServer Netware 4.x" },
1011*b636d99dSDavid van Moolenbroek { 0x0278, "DirectoryServer Netware 4.x" },
1012*b636d99dSDavid van Moolenbroek { 0x027b, "NetwareManagementAgent" },
1013*b636d99dSDavid van Moolenbroek { 0x0280, "Novell File and Printer Sharing Service for PC" },
1014*b636d99dSDavid van Moolenbroek { 0x0304, "NovellSAA Gateway" },
1015*b636d99dSDavid van Moolenbroek { 0x0308, "COM/VERMED" },
1016*b636d99dSDavid van Moolenbroek { 0x030a, "GalacticommWorldgroupServer" },
1017*b636d99dSDavid van Moolenbroek { 0x030c, "IntelNetport2/HP JetDirect/HP Quicksilver" },
1018*b636d99dSDavid van Moolenbroek { 0x0320, "AttachmateGateway" },
1019*b636d99dSDavid van Moolenbroek { 0x0327, "MicrosoftDiagnostiocs" },
1020*b636d99dSDavid van Moolenbroek { 0x0328, "WATCOM SQL Server" },
1021*b636d99dSDavid van Moolenbroek { 0x0335, "MultiTechSystems MultisynchCommServer" },
1022*b636d99dSDavid van Moolenbroek { 0x0343, "Xylogics RemoteAccessServer/LANModem" },
1023*b636d99dSDavid van Moolenbroek { 0x0355, "ArcadaBackupExec" },
1024*b636d99dSDavid van Moolenbroek { 0x0358, "MSLCD1" },
1025*b636d99dSDavid van Moolenbroek { 0x0361, "NETINELO" },
1026*b636d99dSDavid van Moolenbroek { 0x037e, "Powerchute UPS Monitoring" },
1027*b636d99dSDavid van Moolenbroek { 0x037f, "ViruSafeNotify" },
1028*b636d99dSDavid van Moolenbroek { 0x0386, "HP Bridge" },
1029*b636d99dSDavid van Moolenbroek { 0x0387, "HP Hub" },
1030*b636d99dSDavid van Moolenbroek { 0x0394, "NetWare SAA Gateway" },
1031*b636d99dSDavid van Moolenbroek { 0x039b, "LotusNotes" },
1032*b636d99dSDavid van Moolenbroek { 0x03b7, "CertusAntiVirus" },
1033*b636d99dSDavid van Moolenbroek { 0x03c4, "ARCserve4.0" },
1034*b636d99dSDavid van Moolenbroek { 0x03c7, "LANspool3.5" },
1035*b636d99dSDavid van Moolenbroek { 0x03d7, "LexmarkPrinterServer" },
1036*b636d99dSDavid van Moolenbroek { 0x03d8, "LexmarkXLE PrinterServer" },
1037*b636d99dSDavid van Moolenbroek { 0x03dd, "BanyanENS NetwareClient" },
1038*b636d99dSDavid van Moolenbroek { 0x03de, "GuptaSequelBaseServer/NetWareSQL" },
1039*b636d99dSDavid van Moolenbroek { 0x03e1, "UnivelUnixware" },
1040*b636d99dSDavid van Moolenbroek { 0x03e4, "UnivelUnixware" },
1041*b636d99dSDavid van Moolenbroek { 0x03fc, "IntelNetport" },
1042*b636d99dSDavid van Moolenbroek { 0x03fd, "PrintServerQueue" },
1043*b636d99dSDavid van Moolenbroek { 0x040A, "ipnServer" },
1044*b636d99dSDavid van Moolenbroek { 0x040D, "LVERRMAN" },
1045*b636d99dSDavid van Moolenbroek { 0x040E, "LVLIC" },
1046*b636d99dSDavid van Moolenbroek { 0x0414, "NET Silicon (DPI)/Kyocera" },
1047*b636d99dSDavid van Moolenbroek { 0x0429, "SiteLockVirus" },
1048*b636d99dSDavid van Moolenbroek { 0x0432, "UFHELPR???" },
1049*b636d99dSDavid van Moolenbroek { 0x0433, "Synoptics281xAdvancedSNMPAgent" },
1050*b636d99dSDavid van Moolenbroek { 0x0444, "MicrosoftNT SNA Server" },
1051*b636d99dSDavid van Moolenbroek { 0x0448, "Oracle" },
1052*b636d99dSDavid van Moolenbroek { 0x044c, "ARCserve5.01" },
1053*b636d99dSDavid van Moolenbroek { 0x0457, "CanonGP55" },
1054*b636d99dSDavid van Moolenbroek { 0x045a, "QMS Printers" },
1055*b636d99dSDavid van Moolenbroek { 0x045b, "DellSCSI Array" },
1056*b636d99dSDavid van Moolenbroek { 0x0491, "NetBlazerModems" },
1057*b636d99dSDavid van Moolenbroek { 0x04ac, "OnTimeScheduler" },
1058*b636d99dSDavid van Moolenbroek { 0x04b0, "CD-Net" },
1059*b636d99dSDavid van Moolenbroek { 0x0513, "EmulexNQA" },
1060*b636d99dSDavid van Moolenbroek { 0x0520, "SiteLockChecks" },
1061*b636d99dSDavid van Moolenbroek { 0x0529, "SiteLockChecks" },
1062*b636d99dSDavid van Moolenbroek { 0x052d, "CitrixOS2 AppServer" },
1063*b636d99dSDavid van Moolenbroek { 0x0535, "Tektronix" },
1064*b636d99dSDavid van Moolenbroek { 0x0536, "Milan" },
1065*b636d99dSDavid van Moolenbroek { 0x055d, "Attachmate SNA gateway" },
1066*b636d99dSDavid van Moolenbroek { 0x056b, "IBM8235 ModemServer" },
1067*b636d99dSDavid van Moolenbroek { 0x056c, "ShivaLanRover/E PLUS" },
1068*b636d99dSDavid van Moolenbroek { 0x056d, "ShivaLanRover/T PLUS" },
1069*b636d99dSDavid van Moolenbroek { 0x0580, "McAfeeNetShield" },
1070*b636d99dSDavid van Moolenbroek { 0x05B8, "NLM to workstation communication (Revelation Software)" },
1071*b636d99dSDavid van Moolenbroek { 0x05BA, "CompatibleSystemsRouters" },
1072*b636d99dSDavid van Moolenbroek { 0x05BE, "CheyenneHierarchicalStorageManager" },
1073*b636d99dSDavid van Moolenbroek { 0x0606, "JCWatermarkImaging" },
1074*b636d99dSDavid van Moolenbroek { 0x060c, "AXISNetworkPrinter" },
1075*b636d99dSDavid van Moolenbroek { 0x0610, "AdaptecSCSIManagement" },
1076*b636d99dSDavid van Moolenbroek { 0x0621, "IBM AntiVirus" },
1077*b636d99dSDavid van Moolenbroek { 0x0640, "Windows95 RemoteRegistryService" },
1078*b636d99dSDavid van Moolenbroek { 0x064e, "MicrosoftIIS" },
1079*b636d99dSDavid van Moolenbroek { 0x067b, "Microsoft Win95/98 File and Print Sharing for NetWare" },
1080*b636d99dSDavid van Moolenbroek { 0x067c, "Microsoft Win95/98 File and Print Sharing for NetWare" },
1081*b636d99dSDavid van Moolenbroek { 0x076C, "Xerox" },
1082*b636d99dSDavid van Moolenbroek { 0x079b, "ShivaLanRover/E 115" },
1083*b636d99dSDavid van Moolenbroek { 0x079c, "ShivaLanRover/T 115" },
1084*b636d99dSDavid van Moolenbroek { 0x07B4, "CubixWorldDesk" },
1085*b636d99dSDavid van Moolenbroek { 0x07c2, "Quarterdeck IWare Connect V2.x NLM" },
1086*b636d99dSDavid van Moolenbroek { 0x07c1, "Quarterdeck IWare Connect V3.x NLM" },
1087*b636d99dSDavid van Moolenbroek { 0x0810, "ELAN License Server Demo" },
1088*b636d99dSDavid van Moolenbroek { 0x0824, "ShivaLanRoverAccessSwitch/E" },
1089*b636d99dSDavid van Moolenbroek { 0x086a, "ISSC Collector" },
1090*b636d99dSDavid van Moolenbroek { 0x087f, "ISSC DAS AgentAIX" },
1091*b636d99dSDavid van Moolenbroek { 0x0880, "Intel Netport PRO" },
1092*b636d99dSDavid van Moolenbroek { 0x0881, "Intel Netport PRO" },
1093*b636d99dSDavid van Moolenbroek { 0x0b29, "SiteLock" },
1094*b636d99dSDavid van Moolenbroek { 0x0c29, "SiteLockApplications" },
1095*b636d99dSDavid van Moolenbroek { 0x0c2c, "LicensingServer" },
1096*b636d99dSDavid van Moolenbroek { 0x2101, "PerformanceTechnologyInstantInternet" },
1097*b636d99dSDavid van Moolenbroek { 0x2380, "LAI SiteLock" },
1098*b636d99dSDavid van Moolenbroek { 0x238c, "MeetingMaker" },
1099*b636d99dSDavid van Moolenbroek { 0x4808, "SiteLockServer/SiteLockMetering" },
1100*b636d99dSDavid van Moolenbroek { 0x5555, "SiteLockUser" },
1101*b636d99dSDavid van Moolenbroek { 0x6312, "Tapeware" },
1102*b636d99dSDavid van Moolenbroek { 0x6f00, "RabbitGateway" },
1103*b636d99dSDavid van Moolenbroek { 0x7703, "MODEM" },
1104*b636d99dSDavid van Moolenbroek { 0x8002, "NetPortPrinters" },
1105*b636d99dSDavid van Moolenbroek { 0x8008, "WordPerfectNetworkVersion" },
1106*b636d99dSDavid van Moolenbroek { 0x85BE, "Cisco EIGRP" },
1107*b636d99dSDavid van Moolenbroek { 0x8888, "WordPerfectNetworkVersion/QuickNetworkManagement" },
1108*b636d99dSDavid van Moolenbroek { 0x9000, "McAfeeNetShield" },
1109*b636d99dSDavid van Moolenbroek { 0x9604, "CSA-NT_MON" },
1110*b636d99dSDavid van Moolenbroek { 0xb6a8, "OceanIsleReachoutRemoteControl" },
1111*b636d99dSDavid van Moolenbroek { 0xf11f, "SiteLockMetering" },
1112*b636d99dSDavid van Moolenbroek { 0xf1ff, "SiteLock" },
1113*b636d99dSDavid van Moolenbroek { 0xf503, "Microsoft SQL Server" },
1114*b636d99dSDavid van Moolenbroek { 0xF905, "IBM TimeAndPlace" },
1115*b636d99dSDavid van Moolenbroek { 0xfbfb, "TopCallIII FaxServer" },
1116*b636d99dSDavid van Moolenbroek { 0xffff, "AnyService/Wildcard" },
1117*b636d99dSDavid van Moolenbroek { 0, (char *)0 }
1118*b636d99dSDavid van Moolenbroek };
1119*b636d99dSDavid van Moolenbroek
1120*b636d99dSDavid van Moolenbroek static void
init_ipxsaparray(void)1121*b636d99dSDavid van Moolenbroek init_ipxsaparray(void)
1122*b636d99dSDavid van Moolenbroek {
1123*b636d99dSDavid van Moolenbroek register int i;
1124*b636d99dSDavid van Moolenbroek register struct hnamemem *table;
1125*b636d99dSDavid van Moolenbroek
1126*b636d99dSDavid van Moolenbroek for (i = 0; ipxsap_db[i].s != NULL; i++) {
1127*b636d99dSDavid van Moolenbroek int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1);
1128*b636d99dSDavid van Moolenbroek table = &ipxsaptable[j];
1129*b636d99dSDavid van Moolenbroek while (table->name)
1130*b636d99dSDavid van Moolenbroek table = table->nxt;
1131*b636d99dSDavid van Moolenbroek table->name = ipxsap_db[i].s;
1132*b636d99dSDavid van Moolenbroek table->addr = htons(ipxsap_db[i].v);
1133*b636d99dSDavid van Moolenbroek table->nxt = newhnamemem();
1134*b636d99dSDavid van Moolenbroek }
1135*b636d99dSDavid van Moolenbroek }
1136*b636d99dSDavid van Moolenbroek
1137*b636d99dSDavid van Moolenbroek /*
1138*b636d99dSDavid van Moolenbroek * Initialize the address to name translation machinery. We map all
1139*b636d99dSDavid van Moolenbroek * non-local IP addresses to numeric addresses if ndo->ndo_fflag is true
1140*b636d99dSDavid van Moolenbroek * (i.e., to prevent blocking on the nameserver). localnet is the IP address
1141*b636d99dSDavid van Moolenbroek * of the local network. mask is its subnet mask.
1142*b636d99dSDavid van Moolenbroek */
1143*b636d99dSDavid van Moolenbroek void
init_addrtoname(netdissect_options * ndo,uint32_t localnet,uint32_t mask)1144*b636d99dSDavid van Moolenbroek init_addrtoname(netdissect_options *ndo, uint32_t localnet, uint32_t mask)
1145*b636d99dSDavid van Moolenbroek {
1146*b636d99dSDavid van Moolenbroek if (ndo->ndo_fflag) {
1147*b636d99dSDavid van Moolenbroek f_localnet = localnet;
1148*b636d99dSDavid van Moolenbroek f_netmask = mask;
1149*b636d99dSDavid van Moolenbroek }
1150*b636d99dSDavid van Moolenbroek if (ndo->ndo_nflag)
1151*b636d99dSDavid van Moolenbroek /*
1152*b636d99dSDavid van Moolenbroek * Simplest way to suppress names.
1153*b636d99dSDavid van Moolenbroek */
1154*b636d99dSDavid van Moolenbroek return;
1155*b636d99dSDavid van Moolenbroek
1156*b636d99dSDavid van Moolenbroek init_etherarray();
1157*b636d99dSDavid van Moolenbroek init_servarray(ndo);
1158*b636d99dSDavid van Moolenbroek init_eprotoarray();
1159*b636d99dSDavid van Moolenbroek init_protoidarray();
1160*b636d99dSDavid van Moolenbroek init_ipxsaparray();
1161*b636d99dSDavid van Moolenbroek }
1162*b636d99dSDavid van Moolenbroek
1163*b636d99dSDavid van Moolenbroek const char *
dnaddr_string(netdissect_options * ndo,u_short dnaddr)1164*b636d99dSDavid van Moolenbroek dnaddr_string(netdissect_options *ndo, u_short dnaddr)
1165*b636d99dSDavid van Moolenbroek {
1166*b636d99dSDavid van Moolenbroek register struct hnamemem *tp;
1167*b636d99dSDavid van Moolenbroek
1168*b636d99dSDavid van Moolenbroek for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0;
1169*b636d99dSDavid van Moolenbroek tp = tp->nxt)
1170*b636d99dSDavid van Moolenbroek if (tp->addr == dnaddr)
1171*b636d99dSDavid van Moolenbroek return (tp->name);
1172*b636d99dSDavid van Moolenbroek
1173*b636d99dSDavid van Moolenbroek tp->addr = dnaddr;
1174*b636d99dSDavid van Moolenbroek tp->nxt = newhnamemem();
1175*b636d99dSDavid van Moolenbroek if (ndo->ndo_nflag)
1176*b636d99dSDavid van Moolenbroek tp->name = dnnum_string(dnaddr);
1177*b636d99dSDavid van Moolenbroek else
1178*b636d99dSDavid van Moolenbroek tp->name = dnname_string(dnaddr);
1179*b636d99dSDavid van Moolenbroek
1180*b636d99dSDavid van Moolenbroek return(tp->name);
1181*b636d99dSDavid van Moolenbroek }
1182*b636d99dSDavid van Moolenbroek
1183*b636d99dSDavid van Moolenbroek /* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
1184*b636d99dSDavid van Moolenbroek struct hnamemem *
newhnamemem(void)1185*b636d99dSDavid van Moolenbroek newhnamemem(void)
1186*b636d99dSDavid van Moolenbroek {
1187*b636d99dSDavid van Moolenbroek register struct hnamemem *p;
1188*b636d99dSDavid van Moolenbroek static struct hnamemem *ptr = NULL;
1189*b636d99dSDavid van Moolenbroek static u_int num = 0;
1190*b636d99dSDavid van Moolenbroek
1191*b636d99dSDavid van Moolenbroek if (num <= 0) {
1192*b636d99dSDavid van Moolenbroek num = 64;
1193*b636d99dSDavid van Moolenbroek ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
1194*b636d99dSDavid van Moolenbroek if (ptr == NULL)
1195*b636d99dSDavid van Moolenbroek error("newhnamemem: calloc");
1196*b636d99dSDavid van Moolenbroek }
1197*b636d99dSDavid van Moolenbroek --num;
1198*b636d99dSDavid van Moolenbroek p = ptr++;
1199*b636d99dSDavid van Moolenbroek return (p);
1200*b636d99dSDavid van Moolenbroek }
1201*b636d99dSDavid van Moolenbroek
1202*b636d99dSDavid van Moolenbroek #ifdef INET6
1203*b636d99dSDavid van Moolenbroek /* Return a zero'ed h6namemem struct and cuts down on calloc() overhead */
1204*b636d99dSDavid van Moolenbroek struct h6namemem *
newh6namemem(void)1205*b636d99dSDavid van Moolenbroek newh6namemem(void)
1206*b636d99dSDavid van Moolenbroek {
1207*b636d99dSDavid van Moolenbroek register struct h6namemem *p;
1208*b636d99dSDavid van Moolenbroek static struct h6namemem *ptr = NULL;
1209*b636d99dSDavid van Moolenbroek static u_int num = 0;
1210*b636d99dSDavid van Moolenbroek
1211*b636d99dSDavid van Moolenbroek if (num <= 0) {
1212*b636d99dSDavid van Moolenbroek num = 64;
1213*b636d99dSDavid van Moolenbroek ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
1214*b636d99dSDavid van Moolenbroek if (ptr == NULL)
1215*b636d99dSDavid van Moolenbroek error("newh6namemem: calloc");
1216*b636d99dSDavid van Moolenbroek }
1217*b636d99dSDavid van Moolenbroek --num;
1218*b636d99dSDavid van Moolenbroek p = ptr++;
1219*b636d99dSDavid van Moolenbroek return (p);
1220*b636d99dSDavid van Moolenbroek }
1221*b636d99dSDavid van Moolenbroek #endif /* INET6 */
1222*b636d99dSDavid van Moolenbroek
1223*b636d99dSDavid van Moolenbroek /* Represent TCI part of the 802.1Q 4-octet tag as text. */
1224*b636d99dSDavid van Moolenbroek const char *
ieee8021q_tci_string(const uint16_t tci)1225*b636d99dSDavid van Moolenbroek ieee8021q_tci_string(const uint16_t tci)
1226*b636d99dSDavid van Moolenbroek {
1227*b636d99dSDavid van Moolenbroek static char buf[128];
1228*b636d99dSDavid van Moolenbroek snprintf(buf, sizeof(buf), "vlan %u, p %u%s",
1229*b636d99dSDavid van Moolenbroek tci & 0xfff,
1230*b636d99dSDavid van Moolenbroek tci >> 13,
1231*b636d99dSDavid van Moolenbroek (tci & 0x1000) ? ", DEI" : "");
1232*b636d99dSDavid van Moolenbroek return buf;
1233*b636d99dSDavid van Moolenbroek }
1234