2 * Copyright (c) 1994, 1995, 1996, 1997
3 * The Regents of the University of California. All rights reserved.
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
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.
22 static const char rcsid
[] =
23 "@(#) $Header: /tcpdump/master/tcpdump/print-atm.c,v 1.25 2002-08-01 08:53:01 risso Exp $ (LBL)";
30 #include <tcpdump-stdinc.h>
36 #include "interface.h"
38 #include "addrtoname.h"
39 #include "ethertype.h"
46 * Print an RFC 1483 LLC-encapsulated ATM frame.
49 atm_llc_print(const u_char
*p
, int length
, int caplen
)
51 struct ether_header ehdr
;
53 u_short extracted_ethertype
;
55 ether_type
= p
[6] << 8 | p
[7];
58 * Fake up an Ethernet header for the benefit of printers that
59 * insist on "packetp" pointing to an Ethernet header.
61 memset(&ehdr
, '\0', sizeof ehdr
);
64 * Some printers want to get back at the ethernet addresses.
65 * Rather than pass it all the way down, we set this global.
67 * Actually, the only printers that use packetp are print-arp.c
68 * and print-bootp.c, and they assume that packetp points to an
69 * Ethernet header. The right thing to do is to fix them to know
70 * which link type is in use when they excavate. XXX
72 packetp
= (u_char
*)&ehdr
;
74 if (!llc_print(p
, length
, caplen
, ESRC(&ehdr
), EDST(&ehdr
),
75 &extracted_ethertype
)) {
76 /* ether_type not known, print raw packet */
77 if (extracted_ethertype
) {
79 etherproto_string(htons(extracted_ethertype
)));
82 default_print(p
, caplen
);
87 * This is the top level routine of the printer. 'p' is the points
88 * to the LLC/SNAP header of the packet, 'tvp' is the timestamp,
89 * 'length' is the length of the packet off the wire, and 'caplen'
90 * is the number of bytes actually captured.
93 atm_if_print(u_char
*user
, const struct pcap_pkthdr
*h
, const u_char
*p
)
95 u_int caplen
= h
->caplen
;
96 u_int length
= h
->len
;
107 * Some printers want to check that they're not walking off the
109 * Rather than pass it all the way down, we set this global.
111 snapend
= p
+ caplen
;
113 if (p
[0] != 0xaa || p
[1] != 0xaa || p
[2] != 0x03) {
115 * XXX - assume 802.6 MAC header from Fore driver.
116 * XXX - should we also assume it's not a MAC header
117 * if it begins with 0xfe 0xfe 0x03, for RFC 2684
118 * routed NLPID-formatted PDUs?
121 printf("%04x%04x %04x%04x ",
122 p
[0] << 24 | p
[1] << 16 | p
[2] << 8 | p
[3],
123 p
[4] << 24 | p
[5] << 16 | p
[6] << 8 | p
[7],
124 p
[8] << 24 | p
[9] << 16 | p
[10] << 8 | p
[11],
125 p
[12] << 24 | p
[13] << 16 | p
[14] << 8 | p
[15]);
130 atm_llc_print(p
, length
, caplen
);
132 default_print(p
, caplen
);
140 static struct tok msgtype2str
[] = {
141 { CALL_PROCEED
, "Call_proceeding" },
142 { CONNECT
, "Connect" },
143 { CONNECT_ACK
, "Connect_ack" },
145 { RELEASE
, "Release" },
146 { RELEASE_DONE
, "Release_complete" },
147 { RESTART
, "Restart" },
148 { RESTART_ACK
, "Restart_ack" },
149 { STATUS
, "Status" },
150 { STATUS_ENQ
, "Status_enquiry" },
151 { ADD_PARTY
, "Add_party" },
152 { ADD_PARTY_ACK
, "Add_party_ack" },
153 { ADD_PARTY_REJ
, "Add_party_reject" },
154 { DROP_PARTY
, "Drop_party" },
155 { DROP_PARTY_ACK
, "Drop_party_ack" },
160 sig_print(const u_char
*p
, int caplen
)
162 bpf_u_int32 call_ref
;
164 if (caplen
< PROTO_POS
) {
168 if (p
[PROTO_POS
] == Q2931
) {
170 * protocol:Q.2931 for User to Network Interface
171 * (UNI 3.1) signalling
174 if (caplen
< MSG_TYPE_POS
) {
179 tok2str(msgtype2str
, "msgtype#%d", p
[MSG_TYPE_POS
]));
181 if (caplen
< CALL_REF_POS
+3) {
185 call_ref
= EXTRACT_24BITS(&p
[CALL_REF_POS
]);
186 printf("CALL_REF:0x%06x", call_ref
);
188 /* SCCOP with some unknown protocol atop it */
189 printf("SSCOP, proto %d ", p
[PROTO_POS
]);
194 * Print an ATM PDU (such as an AAL5 PDU).
197 atm_print(u_int vpi
, u_int vci
, u_int traftype
, const u_char
*p
, u_int length
,
201 printf("VPI:%u VCI:%u ", vpi
, vci
);
204 * Some printers want to check that they're not walking off the
206 * Rather than pass it all the way down, we set this global.
208 snapend
= p
+ caplen
;
214 sig_print(p
, caplen
);
218 printf("broadcast sig: ");
222 printf("oamF4(segment): ");
226 printf("oamF4(end): ");
235 snmp_print(p
, length
);
245 * Assumes traffic is LLC if unknown.
247 atm_llc_print(p
, length
, caplen
);
251 lane_print(p
, length
, caplen
);
257 default_print(p
, caplen
);