]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/print-atm.c
This commit was generated by cvs2svn to compensate for changes in r141858,
[FreeBSD/FreeBSD.git] / contrib / tcpdump / print-atm.c
1 /*
2  * Copyright (c) 1994, 1995, 1996, 1997
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that: (1) source code distributions
7  * retain the above copyright notice and this paragraph in its entirety, (2)
8  * distributions including binary code include the above copyright notice and
9  * this paragraph in its entirety in the documentation or other materials
10  * provided with the distribution, and (3) all advertising materials mentioning
11  * features or use of this software display the following acknowledgement:
12  * ``This product includes software developed by the University of California,
13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14  * the University nor the names of its contributors may be used to endorse
15  * or promote products derived from this software without specific prior
16  * written permission.
17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * $FreeBSD$
22  */
23 #ifndef lint
24 static const char rcsid[] _U_ =
25     "@(#) $Header: /tcpdump/master/tcpdump/print-atm.c,v 1.33.2.2 2003/11/16 08:51:11 guy Exp $ (LBL)";
26 #endif
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include <tcpdump-stdinc.h>
33
34 #include <stdio.h>
35 #include <pcap.h>
36 #include <string.h>
37
38 #include "interface.h"
39 #include "extract.h"
40 #include "addrtoname.h"
41 #include "ethertype.h"
42 #include "atm.h"
43 #include "atmuni31.h"
44 #include "llc.h"
45
46 #include "ether.h"
47
48 /*
49  * Print an RFC 1483 LLC-encapsulated ATM frame.
50  */
51 static void
52 atm_llc_print(const u_char *p, int length, int caplen)
53 {
54         u_short extracted_ethertype;
55
56         if (!llc_print(p, length, caplen, NULL, NULL,
57             &extracted_ethertype)) {
58                 /* ether_type not known, print raw packet */
59                 if (extracted_ethertype) {
60                         printf("(LLC %s) ",
61                 etherproto_string(htons(extracted_ethertype)));
62                 }
63                 if (!xflag && !qflag)
64                         default_print(p, caplen);
65         }
66 }
67
68 /*
69  * Given a SAP value, generate the LLC header value for a UI packet
70  * with that SAP as the source and destination SAP.
71  */
72 #define LLC_UI_HDR(sap) ((sap)<<16 | (sap<<8) | 0x03)
73
74 /*
75  * This is the top level routine of the printer.  'p' points
76  * to the LLC/SNAP header of the packet, 'h->ts' is the timestamp,
77  * 'h->length' is the length of the packet off the wire, and 'h->caplen'
78  * is the number of bytes actually captured.
79  */
80 u_int
81 atm_if_print(const struct pcap_pkthdr *h, const u_char *p)
82 {
83         u_int caplen = h->caplen;
84         u_int length = h->len;
85         u_int32_t llchdr;
86         u_int hdrlen = 0;
87
88         if (caplen < 8) {
89                 printf("[|atm]");
90                 return (caplen);
91         }
92         /*
93          * Extract the presumed LLC header into a variable, for quick
94          * testing.
95          * Then check for a header that's neither a header for a SNAP
96          * packet nor an RFC 2684 routed NLPID-formatted PDU nor
97          * an 802.2-but-no-SNAP IP packet.
98          */
99         llchdr = EXTRACT_24BITS(p);
100         if (llchdr != LLC_UI_HDR(LLCSAP_SNAP) &&
101             llchdr != LLC_UI_HDR(LLCSAP_ISONS) &&
102             llchdr != LLC_UI_HDR(LLCSAP_IP)) {
103                 /*
104                  * XXX - assume 802.6 MAC header from Fore driver.
105                  *
106                  * Unfortunately, the above list doesn't check for
107                  * all known SAPs, doesn't check for headers where
108                  * the source and destination SAP aren't the same,
109                  * and doesn't check for non-UI frames.  It also
110                  * runs the risk of an 802.6 MAC header that happens
111                  * to begin with one of those values being
112                  * incorrectly treated as an 802.2 header.
113                  *
114                  * So is that Fore driver still around?  And, if so,
115                  * is it still putting 802.6 MAC headers on ATM
116                  * packets?  If so, could it be changed to use a
117                  * new DLT_IEEE802_6 value if we added it?
118                  */
119                 if (eflag)
120                         printf("%08x%08x %08x%08x ",
121                                EXTRACT_32BITS(p),
122                                EXTRACT_32BITS(p+4),
123                                EXTRACT_32BITS(p+8),
124                                EXTRACT_32BITS(p+12));
125                 p += 20;
126                 length -= 20;
127                 caplen -= 20;
128                 hdrlen += 20;
129         }
130         atm_llc_print(p, length, caplen);
131         return (hdrlen);
132 }
133
134 /*
135  * ATM signalling.
136  */
137 static struct tok msgtype2str[] = {
138         { CALL_PROCEED,         "Call_proceeding" },
139         { CONNECT,              "Connect" },
140         { CONNECT_ACK,          "Connect_ack" },
141         { SETUP,                "Setup" },
142         { RELEASE,              "Release" },
143         { RELEASE_DONE,         "Release_complete" },
144         { RESTART,              "Restart" },
145         { RESTART_ACK,          "Restart_ack" },
146         { STATUS,               "Status" },
147         { STATUS_ENQ,           "Status_enquiry" },
148         { ADD_PARTY,            "Add_party" },
149         { ADD_PARTY_ACK,        "Add_party_ack" },
150         { ADD_PARTY_REJ,        "Add_party_reject" },
151         { DROP_PARTY,           "Drop_party" },
152         { DROP_PARTY_ACK,       "Drop_party_ack" },
153         { 0,                    NULL }
154 };
155
156 static void
157 sig_print(const u_char *p, int caplen)
158 {
159         bpf_u_int32 call_ref;
160
161         if (caplen < PROTO_POS) {
162                 printf("[|atm]");
163                 return;
164         }
165         if (p[PROTO_POS] == Q2931) {
166                 /*
167                  * protocol:Q.2931 for User to Network Interface 
168                  * (UNI 3.1) signalling
169                  */
170                 printf("Q.2931");
171                 if (caplen < MSG_TYPE_POS) {
172                         printf(" [|atm]");
173                         return;
174                 }
175                 printf(":%s ",
176                     tok2str(msgtype2str, "msgtype#%d", p[MSG_TYPE_POS]));
177
178                 if (caplen < CALL_REF_POS+3) {
179                         printf("[|atm]");
180                         return;
181                 }
182                 call_ref = EXTRACT_24BITS(&p[CALL_REF_POS]);
183                 printf("CALL_REF:0x%06x", call_ref);
184         } else {
185                 /* SCCOP with some unknown protocol atop it */
186                 printf("SSCOP, proto %d ", p[PROTO_POS]);
187         }
188 }
189
190 /*
191  * Print an ATM PDU (such as an AAL5 PDU).
192  */
193 void
194 atm_print(u_int vpi, u_int vci, u_int traftype, const u_char *p, u_int length,
195     u_int caplen)
196 {
197         if (eflag)
198                 printf("VPI:%u VCI:%u ", vpi, vci);
199
200         if (vpi == 0) {
201                 switch (vci) {
202
203                 case PPC:
204                         sig_print(p, caplen);
205                         return;
206
207                 case BCC:
208                         printf("broadcast sig: ");
209                         return;
210
211                 case OAMF4SC:
212                         printf("oamF4(segment): ");
213                         return;
214
215                 case OAMF4EC:
216                         printf("oamF4(end): ");
217                         return;
218
219                 case METAC:
220                         printf("meta: ");
221                         return;
222
223                 case ILMIC:
224                         printf("ilmi: ");
225                         snmp_print(p, length);
226                         return;
227                 }
228         }
229
230         switch (traftype) {
231
232         case ATM_LLC:
233         default:
234                 /*
235                  * Assumes traffic is LLC if unknown.
236                  */
237                 atm_llc_print(p, length, caplen);
238                 break;
239
240         case ATM_LANE:
241                 lane_print(p, length, caplen);
242                 break;
243         }
244 }