Deleted Added
full compact
print-ether.c (56896) print-ether.c (75118)
1/*
2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 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

--- 4 unchanged lines hidden (view full) ---

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 *
1/*
2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 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

--- 4 unchanged lines hidden (view full) ---

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: head/contrib/tcpdump/print-ether.c 56896 2000-01-30 01:05:24Z fenner $
21 * $FreeBSD: head/contrib/tcpdump/print-ether.c 75118 2001-04-03 07:50:46Z fenner $
22 */
23#ifndef lint
24static const char rcsid[] =
22 */
23#ifndef lint
24static const char rcsid[] =
25 "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.48 1999/11/21 09:36:51 fenner Exp $ (LBL)";
25 "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.61 2000/12/22 22:45:10 guy Exp $ (LBL)";
26#endif
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include <sys/param.h>
33#include <sys/time.h>
34#include <sys/socket.h>
35
26#endif
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include <sys/param.h>
33#include <sys/time.h>
34#include <sys/socket.h>
35
36#if __STDC__
37struct mbuf;
38struct rtentry;
36struct mbuf;
37struct rtentry;
39#endif
40#include <net/if.h>
41
42#include <netinet/in.h>
38
39#include <netinet/in.h>
43#include <net/ethernet.h>
44#include <netinet/in_systm.h>
45#include <netinet/ip.h>
46#include <netinet/ip_var.h>
47#include <netinet/udp.h>
48#include <netinet/udp_var.h>
49#include <netinet/tcp.h>
50
51#include <stdio.h>
52#include <pcap.h>
53
40
41#include <stdio.h>
42#include <pcap.h>
43
54#ifdef INET6
55#include <netinet/ip6.h>
56#endif
57
58#include "interface.h"
59#include "addrtoname.h"
60#include "ethertype.h"
61
44#include "interface.h"
45#include "addrtoname.h"
46#include "ethertype.h"
47
48#include "ether.h"
49
62const u_char *packetp;
63const u_char *snapend;
64
65static inline void
66ether_print(register const u_char *bp, u_int length)
67{
68 register const struct ether_header *ep;
69

--- 6 unchanged lines hidden (view full) ---

76 else
77 (void)printf("%s %s %s %d: ",
78 etheraddr_string(ESRC(ep)),
79 etheraddr_string(EDST(ep)),
80 etherproto_string(ep->ether_type),
81 length);
82}
83
50const u_char *packetp;
51const u_char *snapend;
52
53static inline void
54ether_print(register const u_char *bp, u_int length)
55{
56 register const struct ether_header *ep;
57

--- 6 unchanged lines hidden (view full) ---

64 else
65 (void)printf("%s %s %s %d: ",
66 etheraddr_string(ESRC(ep)),
67 etheraddr_string(EDST(ep)),
68 etherproto_string(ep->ether_type),
69 length);
70}
71
84static u_short extracted_ethertype;
85
86/*
87 * This is the top level routine of the printer. 'p' is the points
88 * to the ether header of the packet, 'h->tv' is the timestamp,
89 * 'h->length' is the length of the packet off the wire, and 'h->caplen'
90 * is the number of bytes actually captured.
91 */
92void
93ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
94{
95 u_int caplen = h->caplen;
96 u_int length = h->len;
97 struct ether_header *ep;
98 u_short ether_type;
72/*
73 * This is the top level routine of the printer. 'p' is the points
74 * to the ether header of the packet, 'h->tv' is the timestamp,
75 * 'h->length' is the length of the packet off the wire, and 'h->caplen'
76 * is the number of bytes actually captured.
77 */
78void
79ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
80{
81 u_int caplen = h->caplen;
82 u_int length = h->len;
83 struct ether_header *ep;
84 u_short ether_type;
85 u_short extracted_ethertype;
99
100 ts_print(&h->ts);
101
86
87 ts_print(&h->ts);
88
102 if (caplen < sizeof(struct ether_header)) {
89 if (caplen < ETHER_HDRLEN) {
103 printf("[|ether]");
104 goto out;
105 }
106
107 if (eflag)
108 ether_print(p, length);
109
110 /*
111 * Some printers want to get back at the ethernet addresses,
112 * and/or check that they're not walking off the end of the packet.
113 * Rather than pass them all the way down, we set these globals.
114 */
115 packetp = p;
116 snapend = p + caplen;
117
90 printf("[|ether]");
91 goto out;
92 }
93
94 if (eflag)
95 ether_print(p, length);
96
97 /*
98 * Some printers want to get back at the ethernet addresses,
99 * and/or check that they're not walking off the end of the packet.
100 * Rather than pass them all the way down, we set these globals.
101 */
102 packetp = p;
103 snapend = p + caplen;
104
118 length -= sizeof(struct ether_header);
119 caplen -= sizeof(struct ether_header);
105 length -= ETHER_HDRLEN;
106 caplen -= ETHER_HDRLEN;
120 ep = (struct ether_header *)p;
107 ep = (struct ether_header *)p;
121 p += sizeof(struct ether_header);
108 p += ETHER_HDRLEN;
122
123 ether_type = ntohs(ep->ether_type);
124
125 /*
126 * Is it (gag) an 802.3 encapsulation?
127 */
128 extracted_ethertype = 0;
129 if (ether_type <= ETHERMTU) {
130 /* Try to print the LLC-layer header & higher layers */
109
110 ether_type = ntohs(ep->ether_type);
111
112 /*
113 * Is it (gag) an 802.3 encapsulation?
114 */
115 extracted_ethertype = 0;
116 if (ether_type <= ETHERMTU) {
117 /* Try to print the LLC-layer header & higher layers */
131 if (llc_print(p, length, caplen, ESRC(ep), EDST(ep)) == 0) {
118 if (llc_print(p, length, caplen, ESRC(ep), EDST(ep),
119 &extracted_ethertype) == 0) {
132 /* ether_type not known, print raw packet */
133 if (!eflag)
120 /* ether_type not known, print raw packet */
121 if (!eflag)
134 ether_print((u_char *)ep, length);
122 ether_print((u_char *)ep, length + ETHER_HDRLEN);
135 if (extracted_ethertype) {
136 printf("(LLC %s) ",
137 etherproto_string(htons(extracted_ethertype)));
138 }
139 if (!xflag && !qflag)
140 default_print(p, caplen);
141 }
123 if (extracted_ethertype) {
124 printf("(LLC %s) ",
125 etherproto_string(htons(extracted_ethertype)));
126 }
127 if (!xflag && !qflag)
128 default_print(p, caplen);
129 }
142 } else if (ether_encap_print(ether_type, p, length, caplen) == 0) {
130 } else if (ether_encap_print(ether_type, p, length, caplen,
131 &extracted_ethertype) == 0) {
143 /* ether_type not known, print raw packet */
144 if (!eflag)
132 /* ether_type not known, print raw packet */
133 if (!eflag)
145 ether_print((u_char *)ep, length + sizeof(*ep));
134 ether_print((u_char *)ep, length + ETHER_HDRLEN);
146 if (!xflag && !qflag)
147 default_print(p, caplen);
148 }
149 if (xflag)
150 default_print(p, caplen);
151 out:
152 putchar('\n');
153}
154
155/*
156 * Prints the packet encapsulated in an Ethernet data segment
157 * (or an equivalent encapsulation), given the Ethernet type code.
158 *
159 * Returns non-zero if it can do so, zero if the ethertype is unknown.
160 *
135 if (!xflag && !qflag)
136 default_print(p, caplen);
137 }
138 if (xflag)
139 default_print(p, caplen);
140 out:
141 putchar('\n');
142}
143
144/*
145 * Prints the packet encapsulated in an Ethernet data segment
146 * (or an equivalent encapsulation), given the Ethernet type code.
147 *
148 * Returns non-zero if it can do so, zero if the ethertype is unknown.
149 *
161 * Stuffs the ether type into a global for the benefit of lower layers
162 * that might want to know what it is.
150 * The Ethernet type code is passed through a pointer; if it was
151 * ETHERTYPE_8021Q, it gets updated to be the Ethernet type of
152 * the 802.1Q payload, for the benefit of lower layers that might
153 * want to know what it is.
163 */
164
165int
166ether_encap_print(u_short ethertype, const u_char *p,
154 */
155
156int
157ether_encap_print(u_short ethertype, const u_char *p,
167 u_int length, u_int caplen)
158 u_int length, u_int caplen, u_short *extracted_ethertype)
168{
169 recurse:
159{
160 recurse:
170 extracted_ethertype = ethertype;
161 *extracted_ethertype = ethertype;
171
172 switch (ethertype) {
173
174 case ETHERTYPE_IP:
175 ip_print(p, length);
176 return (1);
177
178#ifdef INET6

--- 21 unchanged lines hidden (view full) ---

200 aarp_print(p, length);
201 return (1);
202
203 case ETHERTYPE_IPX:
204 ipx_print(p, length);
205 return (1);
206
207 case ETHERTYPE_8021Q:
162
163 switch (ethertype) {
164
165 case ETHERTYPE_IP:
166 ip_print(p, length);
167 return (1);
168
169#ifdef INET6

--- 21 unchanged lines hidden (view full) ---

191 aarp_print(p, length);
192 return (1);
193
194 case ETHERTYPE_IPX:
195 ipx_print(p, length);
196 return (1);
197
198 case ETHERTYPE_8021Q:
208 printf("802.1Q vlan#%d P%d%s",
209 ntohs(*(unsigned short*)p)&0xFFF,
210 ntohs(*(unsigned short*)p)>>13,
211 (ntohs(*(unsigned short*)p)&0x1000) ? " CFI" : "");
212 ethertype = ntohs(*(unsigned short*)(p+2));
199 printf("802.1Q vlan#%d P%d%s ",
200 ntohs(*(u_int16_t *)p) & 0xfff,
201 ntohs(*(u_int16_t *)p) >> 13,
202 (ntohs(*(u_int16_t *)p) & 0x1000) ? " CFI" : "");
203 ethertype = ntohs(*(u_int16_t *)(p + 2));
213 p += 4;
214 length -= 4;
215 caplen -= 4;
204 p += 4;
205 length -= 4;
206 caplen -= 4;
216 if (ethertype > ETHERMTU)
207 if (ethertype > ETHERMTU)
217 goto recurse;
218
208 goto recurse;
209
219 extracted_ethertype = 0;
210 *extracted_ethertype = 0;
220
211
221 if (llc_print(p, length, caplen, p-18, p-12) == 0) {
212 if (llc_print(p, length, caplen, p - 18, p - 12,
213 extracted_ethertype) == 0) {
222 /* ether_type not known, print raw packet */
223 if (!eflag)
214 /* ether_type not known, print raw packet */
215 if (!eflag)
224 ether_print(p-18, length+4);
225 if (extracted_ethertype) {
216 ether_print(p - 18, length + 4);
217 if (*extracted_ethertype) {
226 printf("(LLC %s) ",
218 printf("(LLC %s) ",
227 etherproto_string(htons(extracted_ethertype)));
219 etherproto_string(htons(*extracted_ethertype)));
228 }
229 if (!xflag && !qflag)
220 }
221 if (!xflag && !qflag)
230 default_print(p-18, caplen+4);
222 default_print(p - 18, caplen + 4);
231 }
232 return (1);
233
234 case ETHERTYPE_PPPOED:
235 case ETHERTYPE_PPPOES:
236 pppoe_print(p, length);
237 return (1);
238
239 case ETHERTYPE_LAT:
240 case ETHERTYPE_SCA:
241 case ETHERTYPE_MOPRC:
242 case ETHERTYPE_MOPDL:
243 /* default_print for now */
244 default:
245 return (0);
246 }
247}
223 }
224 return (1);
225
226 case ETHERTYPE_PPPOED:
227 case ETHERTYPE_PPPOES:
228 pppoe_print(p, length);
229 return (1);
230
231 case ETHERTYPE_LAT:
232 case ETHERTYPE_SCA:
233 case ETHERTYPE_MOPRC:
234 case ETHERTYPE_MOPDL:
235 /* default_print for now */
236 default:
237 return (0);
238 }
239}