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.24 2002-07-11 09:17:23 guy Exp $ (LBL)";
30 #include <sys/param.h>
32 #include <sys/socket.h>
34 #include <netinet/in.h>
40 #include "interface.h"
42 #include "addrtoname.h"
43 #include "ethertype.h"
50 * Print an RFC 1483 LLC-encapsulated ATM frame.
53 atm_llc_print(const u_char
*p
, int length
, int caplen
)
55 struct ether_header ehdr
;
57 u_short extracted_ethertype
;
59 ether_type
= p
[6] << 8 | p
[7];
62 * Fake up an Ethernet header for the benefit of printers that
63 * insist on "packetp" pointing to an Ethernet header.
65 memset(&ehdr
, '\0', sizeof ehdr
);
68 * Some printers want to get back at the ethernet addresses.
69 * Rather than pass it all the way down, we set this global.
71 * Actually, the only printers that use packetp are print-arp.c
72 * and print-bootp.c, and they assume that packetp points to an
73 * Ethernet header. The right thing to do is to fix them to know
74 * which link type is in use when they excavate. XXX
76 packetp
= (u_char
*)&ehdr
;
78 if (!llc_print(p
, length
, caplen
, ESRC(&ehdr
), EDST(&ehdr
),
79 &extracted_ethertype
)) {
80 /* ether_type not known, print raw packet */
81 if (extracted_ethertype
) {
83 etherproto_string(htons(extracted_ethertype
)));
86 default_print(p
, caplen
);
91 * This is the top level routine of the printer. 'p' is the points
92 * to the LLC/SNAP header of the packet, 'tvp' is the timestamp,
93 * 'length' is the length of the packet off the wire, and 'caplen'
94 * is the number of bytes actually captured.
97 atm_if_print(u_char
*user
, const struct pcap_pkthdr
*h
, const u_char
*p
)
99 u_int caplen
= h
->caplen
;
100 u_int length
= h
->len
;
111 * Some printers want to check that they're not walking off the
113 * Rather than pass it all the way down, we set this global.
115 snapend
= p
+ caplen
;
117 if (p
[0] != 0xaa || p
[1] != 0xaa || p
[2] != 0x03) {
119 * XXX - assume 802.6 MAC header from Fore driver.
120 * XXX - should we also assume it's not a MAC header
121 * if it begins with 0xfe 0xfe 0x03, for RFC 2684
122 * routed NLPID-formatted PDUs?
125 printf("%04x%04x %04x%04x ",
126 p
[0] << 24 | p
[1] << 16 | p
[2] << 8 | p
[3],
127 p
[4] << 24 | p
[5] << 16 | p
[6] << 8 | p
[7],
128 p
[8] << 24 | p
[9] << 16 | p
[10] << 8 | p
[11],
129 p
[12] << 24 | p
[13] << 16 | p
[14] << 8 | p
[15]);
134 atm_llc_print(p
, length
, caplen
);
136 default_print(p
, caplen
);
144 static struct tok msgtype2str
[] = {
145 { CALL_PROCEED
, "Call_proceeding" },
146 { CONNECT
, "Connect" },
147 { CONNECT_ACK
, "Connect_ack" },
149 { RELEASE
, "Release" },
150 { RELEASE_DONE
, "Release_complete" },
151 { RESTART
, "Restart" },
152 { RESTART_ACK
, "Restart_ack" },
153 { STATUS
, "Status" },
154 { STATUS_ENQ
, "Status_enquiry" },
155 { ADD_PARTY
, "Add_party" },
156 { ADD_PARTY_ACK
, "Add_party_ack" },
157 { ADD_PARTY_REJ
, "Add_party_reject" },
158 { DROP_PARTY
, "Drop_party" },
159 { DROP_PARTY_ACK
, "Drop_party_ack" },
164 sig_print(const u_char
*p
, int caplen
)
166 bpf_u_int32 call_ref
;
168 if (caplen
< PROTO_POS
) {
172 if (p
[PROTO_POS
] == Q2931
) {
174 * protocol:Q.2931 for User to Network Interface
175 * (UNI 3.1) signalling
178 if (caplen
< MSG_TYPE_POS
) {
183 tok2str(msgtype2str
, "msgtype#%d", p
[MSG_TYPE_POS
]));
185 if (caplen
< CALL_REF_POS
+3) {
189 call_ref
= EXTRACT_24BITS(&p
[CALL_REF_POS
]);
190 printf("CALL_REF:0x%06x", call_ref
);
192 /* SCCOP with some unknown protocol atop it */
193 printf("SSCOP, proto %d ", p
[PROTO_POS
]);
198 * Print an ATM PDU (such as an AAL5 PDU).
201 atm_print(u_int vpi
, u_int vci
, u_int traftype
, const u_char
*p
, u_int length
,
205 printf("VPI:%u VCI:%u ", vpi
, vci
);
208 * Some printers want to check that they're not walking off the
210 * Rather than pass it all the way down, we set this global.
212 snapend
= p
+ caplen
;
218 sig_print(p
, caplen
);
222 printf("broadcast sig: ");
226 printf("oamF4(segment): ");
230 printf("oamF4(end): ");
239 snmp_print(p
, length
);
249 * Assumes traffic is LLC if unknown.
251 atm_llc_print(p
, length
, caplen
);
255 lane_print(p
, length
, caplen
);
261 default_print(p
, caplen
);