summaryrefslogtreecommitdiff
path: root/print-sll.c
diff options
context:
space:
mode:
authorguy <guy>2000-12-23 20:49:34 +0000
committerguy <guy>2000-12-23 20:49:34 +0000
commite98a14057306474c24fc5d6c19705412904e31da (patch)
tree3a318a6eabc38bfe103f1e3bb59680f87d4232fa /print-sll.c
parent8d35bf0e1cf45929761c0b20480a91fc4be9f0a5 (diff)
downloadtcpdump-e98a14057306474c24fc5d6c19705412904e31da.tar.gz
Have the Linux cooked dissector set "packetp" to point to the fake
Ethernet header it constructs.
Diffstat (limited to 'print-sll.c')
-rw-r--r--print-sll.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/print-sll.c b/print-sll.c
index fcb223e3..b3f70ccf 100644
--- a/print-sll.c
+++ b/print-sll.c
@@ -20,7 +20,7 @@
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-sll.c,v 1.2 2000-12-22 22:45:11 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-sll.c,v 1.3 2000-12-23 20:49:34 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -51,13 +51,10 @@ const u_char *packetp;
const u_char *snapend;
static inline void
-sll_print(register const u_char *bp, u_int length)
+sll_print(register const struct sll_header *sllp, u_int length)
{
- register const struct sll_header *sllp;
u_short halen;
- sllp = (const struct sll_header *)bp;
-
switch (ntohs(sllp->sll_pkttype)) {
case LINUX_SLL_HOST:
@@ -170,15 +167,21 @@ sll_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
}
if (eflag)
- sll_print(p, length);
+ sll_print(sllp, length);
/*
* Some printers want to get back at the ethernet addresses,
* and/or check that they're not walking off the end of the packet.
* Rather than pass them all the way down, we set these globals.
*/
- packetp = p;
snapend = p + caplen;
+ /*
+ * Actually, the only printers that use packetp are print-arp.c
+ * and print-bootp.c, and they assume that packetp points to an
+ * Ethernet header. The right thing to do is to fix them to know
+ * which link type is in use when they excavate. XXX
+ */
+ packetp = (u_char *)&ehdr;
length -= SLL_HDR_LEN;
caplen -= SLL_HDR_LEN;
@@ -211,7 +214,7 @@ sll_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
unknown:
/* ether_type not known, print raw packet */
if (!eflag)
- sll_print(packetp, length + SLL_HDR_LEN);
+ sll_print(sllp, length + SLL_HDR_LEN);
if (extracted_ethertype) {
printf("(LLC %s) ",
etherproto_string(htons(extracted_ethertype)));
@@ -224,7 +227,7 @@ sll_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
&extracted_ethertype) == 0) {
/* ether_type not known, print raw packet */
if (!eflag)
- sll_print(packetp, length + SLL_HDR_LEN);
+ sll_print(sllp, length + SLL_HDR_LEN);
if (!xflag && !qflag)
default_print(p, caplen);
}