xref: /openbsd/usr.sbin/tcpdump/print-ipx.c (revision db3296cf)
1 /*	$OpenBSD: print-ipx.c,v 1.9 2002/02/19 19:39:40 millert Exp $	*/
2 
3 /*
4  * Copyright (c) 1994, 1995, 1996
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that: (1) source code distributions
9  * retain the above copyright notice and this paragraph in its entirety, (2)
10  * distributions including binary code include the above copyright notice and
11  * this paragraph in its entirety in the documentation or other materials
12  * provided with the distribution, and (3) all advertising materials mentioning
13  * features or use of this software display the following acknowledgement:
14  * ``This product includes software developed by the University of California,
15  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16  * the University nor the names of its contributors may be used to endorse
17  * or promote products derived from this software without specific prior
18  * written permission.
19  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22  *
23  * Format and print Novell IPX packets.
24  * Contributed by Brad Parker (brad@fcr.com).
25  */
26 
27 #ifndef lint
28 static const char rcsid[] =
29     "@(#) $Header: /home/cvs/src/usr.sbin/tcpdump/print-ipx.c,v 1.9 2002/02/19 19:39:40 millert Exp $";
30 #endif
31 
32 #include <sys/param.h>
33 #include <sys/time.h>
34 #include <sys/socket.h>
35 
36 #include <netinet/in.h>
37 #include <netinet/in_systm.h>
38 #include <netinet/ip.h>
39 #include <netinet/ip_var.h>
40 #include <netinet/udp.h>
41 #include <netinet/udp_var.h>
42 #include <netinet/tcp.h>
43 
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <string.h>
47 
48 #include "interface.h"
49 #include "addrtoname.h"
50 #include "ipx.h"
51 #include "extract.h"
52 
53 
54 static const char *ipxaddr_string(u_int32_t, const u_char *);
55 void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
56 void ipx_sap_print(const u_short *, u_int);
57 void ipx_rip_print(const u_short *, u_int);
58 
59 /*
60  * Print IPX datagram packets.
61  */
62 void
63 ipx_print(const u_char *p, u_int length)
64 {
65 	const struct ipxHdr *ipx = (const struct ipxHdr *)p;
66 
67 	TCHECK(ipx->srcSkt);
68 	(void)printf("%s.%x > ",
69 		     ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode),
70 		     EXTRACT_16BITS(&ipx->srcSkt));
71 
72 	(void)printf("%s.%x:",
73 		     ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode),
74 		     EXTRACT_16BITS(&ipx->dstSkt));
75 
76 	/* take length from ipx header */
77 	TCHECK(ipx->length);
78 	length = EXTRACT_16BITS(&ipx->length);
79 
80 	ipx_decode(ipx, (u_char *)ipx + ipxSize, length - ipxSize);
81 	return;
82 trunc:
83 	printf("[|ipx %d]", length);
84 }
85 
86 static const char *
87 ipxaddr_string(u_int32_t net, const u_char *node)
88 {
89     static char line[256];
90 
91     snprintf(line, sizeof(line), "%x.%02x:%02x:%02x:%02x:%02x:%02x",
92 	    net, node[0], node[1], node[2], node[3], node[4], node[5]);
93 
94     return line;
95 }
96 
97 void
98 ipx_decode(const struct ipxHdr *ipx, const u_char *datap, u_int length)
99 {
100     register u_short dstSkt;
101 
102     dstSkt = EXTRACT_16BITS(&ipx->dstSkt);
103     switch (dstSkt) {
104       case IPX_SKT_NCP:
105 	(void)printf(" ipx-ncp %d", length);
106 	break;
107       case IPX_SKT_SAP:
108 	ipx_sap_print((u_short *)datap, length);
109 	break;
110       case IPX_SKT_RIP:
111 	ipx_rip_print((u_short *)datap, length);
112 	break;
113       case IPX_SKT_NETBIOS:
114 	(void)printf(" ipx-netbios %d", length);
115 	break;
116       case IPX_SKT_DIAGNOSTICS:
117 	(void)printf(" ipx-diags %d", length);
118 	break;
119       default:
120 	(void)printf(" ipx-#%x %d", dstSkt, length);
121 	break;
122     }
123 }
124 
125 void
126 ipx_sap_print(const u_short *ipx, u_int length)
127 {
128     int command, i;
129 
130     TCHECK(ipx[0]);
131     command = EXTRACT_16BITS(ipx);
132     ipx++;
133     length -= 2;
134 
135     switch (command) {
136       case 1:
137       case 3:
138 	if (command == 1)
139 	    (void)printf("ipx-sap-req");
140 	else
141 	    (void)printf("ipx-sap-nearest-req");
142 
143 	if (length > 0) {
144 	    TCHECK(ipx[1]);
145 	    (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
146 	    fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
147 	    putchar('\'');
148 	}
149 	break;
150 
151       case 2:
152       case 4:
153 	if (command == 2)
154 	    (void)printf("ipx-sap-resp");
155 	else
156 	    (void)printf("ipx-sap-nearest-resp");
157 
158 	for (i = 0; i < 8 && length > 0; i++) {
159 	    TCHECK2(ipx[27], 1);
160 	    (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
161 	    fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
162 	    printf("' addr %s",
163 		ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
164 	    ipx += 32;
165 	    length -= 64;
166 	}
167 	break;
168       default:
169 	    (void)printf("ipx-sap-?%x", command);
170 	break;
171     }
172 	return;
173 trunc:
174 	printf("[|ipx %d]", length);
175 }
176 
177 void
178 ipx_rip_print(const u_short *ipx, u_int length)
179 {
180     int command, i;
181 
182     TCHECK(ipx[0]);
183     command = EXTRACT_16BITS(ipx);
184     ipx++;
185     length -= 2;
186 
187     switch (command) {
188       case 1:
189 	(void)printf("ipx-rip-req");
190 	if (length > 0) {
191 	    TCHECK(ipx[3]);
192 	    (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
193 			 EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
194 	}
195 	break;
196       case 2:
197 	(void)printf("ipx-rip-resp");
198 	for (i = 0; i < 50 && length > 0; i++) {
199 	    TCHECK(ipx[3]);
200 	    (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
201 			 EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
202 
203 	    ipx += 4;
204 	    length -= 8;
205 	}
206 	break;
207       default:
208 	    (void)printf("ipx-rip-?%x", command);
209     }
210 	return;
211 trunc:
212 	printf("[|ipx %d]", length);
213 }
214 
215