source: rtems-libbsd/freebsd/contrib/tcpdump/print-ipx.c @ 084d4db

4.11
Last change on this file since 084d4db was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100644
File size: 5.4 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
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 * $FreeBSD$
27 */
28
29#ifndef lint
30static const char rcsid[] _U_ =
31    "@(#) $Header: /tcpdump/master/tcpdump/print-ipx.c,v 1.42 2005-05-06 08:26:44 guy Exp $";
32#endif
33
34#ifdef HAVE_CONFIG_H
35#include "config.h"
36#endif
37
38#include <tcpdump-stdinc.h>
39
40#include <stdlib.h>
41#include <stdio.h>
42#include <string.h>
43
44#include "interface.h"
45#include "addrtoname.h"
46#include "ipx.h"
47#include "extract.h"
48
49
50static const char *ipxaddr_string(u_int32_t, const u_char *);
51void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
52void ipx_sap_print(const u_short *, u_int);
53void ipx_rip_print(const u_short *, u_int);
54
55/*
56 * Print IPX datagram packets.
57 */
58void
59ipx_print(const u_char *p, u_int length)
60{
61        const struct ipxHdr *ipx = (const struct ipxHdr *)p;
62
63        if (!eflag)
64                printf("IPX ");
65
66        TCHECK(ipx->srcSkt);
67        (void)printf("%s.%04x > ",
68                     ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode),
69                     EXTRACT_16BITS(&ipx->srcSkt));
70
71        (void)printf("%s.%04x: ",
72                     ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode),
73                     EXTRACT_16BITS(&ipx->dstSkt));
74
75        /* take length from ipx header */
76        TCHECK(ipx->length);
77        length = EXTRACT_16BITS(&ipx->length);
78
79        ipx_decode(ipx, (u_char *)ipx + ipxSize, length - ipxSize);
80        return;
81trunc:
82        printf("[|ipx %d]", length);
83}
84
85static const char *
86ipxaddr_string(u_int32_t net, const u_char *node)
87{
88    static char line[256];
89
90    snprintf(line, sizeof(line), "%08x.%02x:%02x:%02x:%02x:%02x:%02x",
91            net, node[0], node[1], node[2], node[3], node[4], node[5]);
92
93    return line;
94}
95
96void
97ipx_decode(const struct ipxHdr *ipx, const u_char *datap, u_int length)
98{
99    register u_short dstSkt;
100
101    dstSkt = EXTRACT_16BITS(&ipx->dstSkt);
102    switch (dstSkt) {
103      case IPX_SKT_NCP:
104        (void)printf("ipx-ncp %d", length);
105        break;
106      case IPX_SKT_SAP:
107        ipx_sap_print((u_short *)datap, length);
108        break;
109      case IPX_SKT_RIP:
110        ipx_rip_print((u_short *)datap, length);
111        break;
112      case IPX_SKT_NETBIOS:
113        (void)printf("ipx-netbios %d", length);
114#ifdef TCPDUMP_DO_SMB
115        ipx_netbios_print(datap, length);
116#endif
117        break;
118      case IPX_SKT_DIAGNOSTICS:
119        (void)printf("ipx-diags %d", length);
120        break;
121      case IPX_SKT_NWLINK_DGM:
122        (void)printf("ipx-nwlink-dgm %d", length);
123#ifdef TCPDUMP_DO_SMB
124        ipx_netbios_print(datap, length);
125#endif
126        break;
127      case IPX_SKT_EIGRP:
128        eigrp_print(datap, length);
129        break;
130      default:
131        (void)printf("ipx-#%x %d", dstSkt, length);
132        break;
133    }
134}
135
136void
137ipx_sap_print(const u_short *ipx, u_int length)
138{
139    int command, i;
140
141    TCHECK(ipx[0]);
142    command = EXTRACT_16BITS(ipx);
143    ipx++;
144    length -= 2;
145
146    switch (command) {
147      case 1:
148      case 3:
149        if (command == 1)
150            (void)printf("ipx-sap-req");
151        else
152            (void)printf("ipx-sap-nearest-req");
153
154        TCHECK(ipx[0]);
155        (void)printf(" %s", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0]))));
156        break;
157
158      case 2:
159      case 4:
160        if (command == 2)
161            (void)printf("ipx-sap-resp");
162        else
163            (void)printf("ipx-sap-nearest-resp");
164
165        for (i = 0; i < 8 && length > 0; i++) {
166            TCHECK(ipx[0]);
167            (void)printf(" %s '", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0]))));
168            if (fn_printzp((u_char *)&ipx[1], 48, snapend)) {
169                printf("'");
170                goto trunc;
171            }
172            TCHECK2(ipx[25], 10);
173            printf("' addr %s",
174                ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
175            ipx += 32;
176            length -= 64;
177        }
178        break;
179      default:
180        (void)printf("ipx-sap-?%x", command);
181        break;
182    }
183    return;
184trunc:
185    printf("[|ipx %d]", length);
186}
187
188void
189ipx_rip_print(const u_short *ipx, u_int length)
190{
191    int command, i;
192
193    TCHECK(ipx[0]);
194    command = EXTRACT_16BITS(ipx);
195    ipx++;
196    length -= 2;
197
198    switch (command) {
199      case 1:
200        (void)printf("ipx-rip-req");
201        if (length > 0) {
202            TCHECK(ipx[3]);
203            (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
204                         EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
205        }
206        break;
207      case 2:
208        (void)printf("ipx-rip-resp");
209        for (i = 0; i < 50 && length > 0; i++) {
210            TCHECK(ipx[3]);
211            (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
212                         EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
213
214            ipx += 4;
215            length -= 8;
216        }
217        break;
218      default:
219        (void)printf("ipx-rip-?%x", command);
220        break;
221    }
222    return;
223trunc:
224    printf("[|ipx %d]", length);
225}
Note: See TracBrowser for help on using the repository browser.