X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/2cfe2bf4a5bdba199215e4c92129a36271b10a64..b58cddb15484ab7abbdd8d12e38a8ab768923f29:/print-ether.c diff --git a/print-ether.c b/print-ether.c index f0b82f92..e715049f 100644 --- a/print-ether.c +++ b/print-ether.c @@ -20,7 +20,7 @@ */ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.65 2001-07-04 22:03:14 fenner Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.68 2002-05-29 10:06:26 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -49,7 +49,7 @@ const u_char *packetp; const u_char *snapend; static inline void -ether_print(register const u_char *bp, u_int length) +ether_hdr_print(register const u_char *bp, u_int length) { register const struct ether_header *ep; @@ -67,31 +67,20 @@ ether_print(register const u_char *bp, u_int length) length); } -/* - * This is the top level routine of the printer. 'p' is the points - * to the ether header of the packet, 'h->tv' is the timestamp, - * 'h->length' is the length of the packet off the wire, and 'h->caplen' - * is the number of bytes actually captured. - */ void -ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) +ether_print(const u_char *p, u_int length, u_int caplen) { - u_int caplen = h->caplen; - u_int length = h->len; struct ether_header *ep; u_short ether_type; u_short extracted_ethertype; - ++infodelay; - ts_print(&h->ts); - if (caplen < ETHER_HDRLEN) { printf("[|ether]"); - goto out; + return; } if (eflag) - ether_print(p, length); + ether_hdr_print(p, length); /* * Some printers want to get back at the ethernet addresses, @@ -118,7 +107,7 @@ ether_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) - ether_print((u_char *)ep, length + ETHER_HDRLEN); + ether_hdr_print((u_char *)ep, length + ETHER_HDRLEN); if (extracted_ethertype) { printf("(LLC %s) ", etherproto_string(htons(extracted_ethertype))); @@ -130,14 +119,38 @@ ether_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) - ether_print((u_char *)ep, length + ETHER_HDRLEN); + ether_hdr_print((u_char *)ep, length + ETHER_HDRLEN); if (!xflag && !qflag) default_print(p, caplen); } - if (xflag) - default_print(p, caplen); - out: +} + +/* + * This is the top level routine of the printer. 'p' is the points + * to the ether header of the packet, 'h->tv' is the timestamp, + * 'h->length' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + */ +void +ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) +{ + u_int caplen = h->caplen; + u_int length = h->len; + + ++infodelay; + ts_print(&h->ts); + + ether_print(p, length, caplen); + + /* + * If "-x" was specified, print stuff past the Ethernet header, + * if there's anything to print. + */ + if (xflag && caplen > ETHER_HDRLEN) + default_print(p + ETHER_HDRLEN, caplen - ETHER_HDRLEN); + putchar('\n'); + --infodelay; if (infoprint) info(0); @@ -194,6 +207,7 @@ ether_encap_print(u_short ethertype, const u_char *p, return (1); case ETHERTYPE_IPX: + printf("(NOV-ETHII) "); ipx_print(p, length); return (1); @@ -215,7 +229,7 @@ ether_encap_print(u_short ethertype, const u_char *p, extracted_ethertype) == 0) { /* ether_type not known, print raw packet */ if (!eflag) - ether_print(p - 18, length + 4); + ether_hdr_print(p - 18, length + 4); if (*extracted_ethertype) { printf("(LLC %s) ", etherproto_string(htons(*extracted_ethertype)));