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.22 2002-04-07 02:54:03 guy Exp $ (LBL)";
30 #include <sys/param.h>
32 #include <sys/socket.h>
34 #include <netinet/in.h>
40 #include "interface.h"
41 #include "addrtoname.h"
42 #include "ethertype.h"
47 * Print an RFC 1483 LLC-encapsulated ATM frame.
50 atm_llc_print(const u_char
*p
, int length
, int caplen
)
52 struct ether_header ehdr
;
54 u_short extracted_ethertype
;
56 ether_type
= p
[6] << 8 | p
[7];
59 * Fake up an Ethernet header for the benefit of printers that
60 * insist on "packetp" pointing to an Ethernet header.
62 memset(&ehdr
, '\0', sizeof ehdr
);
65 * Some printers want to get back at the ethernet addresses,
66 * and/or check that they're not walking off the end of the packet.
67 * Rather than pass them all the way down, we set these globals.
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
;
109 if (p
[0] != 0xaa || p
[1] != 0xaa || p
[2] != 0x03) {
110 /*XXX assume 802.6 MAC header from fore driver */
112 printf("%04x%04x %04x%04x ",
113 p
[0] << 24 | p
[1] << 16 | p
[2] << 8 | p
[3],
114 p
[4] << 24 | p
[5] << 16 | p
[6] << 8 | p
[7],
115 p
[8] << 24 | p
[9] << 16 | p
[10] << 8 | p
[11],
116 p
[12] << 24 | p
[13] << 16 | p
[14] << 8 | p
[15]);
121 atm_llc_print(p
, length
, caplen
);
123 default_print(p
, caplen
);