diff options
author | bms <bms@FreeBSD.org> | 2004-03-31 09:17:26 +0000 |
---|---|---|
committer | bms <bms@FreeBSD.org> | 2004-03-31 09:17:26 +0000 |
commit | 281e9d71408deb6e8c5046c746c2e97002b0e7fe (patch) | |
tree | eb08e08f0f875c3b16f8e1aec86091f100906f1c /contrib/tcpdump/print-token.c | |
parent | be6faec6d07fc3a2a54836e76d0309c36192dfad (diff) | |
download | FreeBSD-src-281e9d71408deb6e8c5046c746c2e97002b0e7fe.zip FreeBSD-src-281e9d71408deb6e8c5046c746c2e97002b0e7fe.tar.gz |
Import tcpdump 3.8.3, from http://www.tcpdump.org/releases/tcpdump-3.8.3.tar.gz
Diffstat (limited to 'contrib/tcpdump/print-token.c')
-rw-r--r-- | contrib/tcpdump/print-token.c | 85 |
1 files changed, 33 insertions, 52 deletions
diff --git a/contrib/tcpdump/print-token.c b/contrib/tcpdump/print-token.c index d2de92d..74f6d8b 100644 --- a/contrib/tcpdump/print-token.c +++ b/contrib/tcpdump/print-token.c @@ -24,19 +24,15 @@ * Guy Harris <guy@alum.mit.edu> */ #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.13 2001/09/18 15:46:37 fenner Exp $"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.22.2.2 2003/11/16 08:51:51 guy Exp $"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include <sys/param.h> -#include <sys/time.h> -#include <sys/socket.h> - -#include <netinet/in.h> +#include <tcpdump-stdinc.h> #include <pcap.h> #include <stdio.h> @@ -61,7 +57,7 @@ extract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst) * Print the TR MAC header */ static inline void -token_print(register const struct token_header *trp, register u_int length, +token_hdr_print(register const struct token_header *trp, register u_int length, register const u_char *fsrc, register const u_char *fdst) { const char *srcname, *dstname; @@ -101,48 +97,26 @@ static const char *largest_frame[] = { "??" }; -/* - * This is the top level routine of the printer. 'p' is the points - * to the TR header of the packet, 'tvp' is the timestamp, - * 'length' is the length of the packet off the wire, and 'caplen' - * is the number of bytes actually captured. - */ -void -token_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) +u_int +token_print(const u_char *p, u_int length, u_int caplen) { - u_int caplen = h->caplen; - u_int length = h->len; const struct token_header *trp; u_short extracted_ethertype; struct ether_header ehdr; - u_int route_len = 0, seg; + u_int route_len = 0, hdr_len = TOKEN_HDRLEN; + int seg; trp = (const struct token_header *)p; - ++infodelay; - ts_print(&h->ts); - if (caplen < TOKEN_HDRLEN) { printf("[|token-ring]"); - goto out; + return hdr_len; } + /* * Get the TR addresses into a canonical form */ extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr)); - /* - * 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. - */ - 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; /* Adjust for source routing information in the MAC header */ if (IS_SOURCE_ROUTED(trp)) { @@ -150,32 +124,33 @@ token_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) *ESRC(&ehdr) &= 0x7f; if (eflag) - token_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); + token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); route_len = RIF_LENGTH(trp); if (vflag) { printf("%s ", broadcast_indicator[BROADCAST(trp)]); printf("%s", direction[DIRECTION(trp)]); - + for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) printf(" [%d:%d]", RING_NUMBER(trp, seg), BRIDGE_NUMBER(trp, seg)); } else { printf("rt = %x", ntohs(trp->token_rcf)); - + for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) printf(":%x", ntohs(trp->token_rseg[seg])); } printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]); } else { if (eflag) - token_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); + token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); } /* Skip over token ring MAC header and routing information */ - length -= TOKEN_HDRLEN + route_len; - p += TOKEN_HDRLEN + route_len; - caplen -= TOKEN_HDRLEN + route_len; + hdr_len += route_len; + length -= hdr_len; + p += hdr_len; + caplen -= hdr_len; /* Frame Control field determines interpretation of packet */ extracted_ethertype = 0; @@ -185,7 +160,7 @@ token_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) - token_print(trp, + token_hdr_print(trp, length + TOKEN_HDRLEN + route_len, ESRC(&ehdr), EDST(&ehdr)); if (extracted_ethertype) { @@ -199,16 +174,22 @@ token_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) /* Some kinds of TR packet we cannot handle intelligently */ /* XXX - dissect MAC packets if frame type is 0 */ if (!eflag) - token_print(trp, length + TOKEN_HDRLEN + route_len, + token_hdr_print(trp, length + TOKEN_HDRLEN + route_len, ESRC(&ehdr), EDST(&ehdr)); if (!xflag && !qflag) default_print(p, caplen); } - if (xflag) - default_print(p, caplen); -out: - putchar('\n'); - --infodelay; - if (infoprint) - info(0); + return (hdr_len); +} + +/* + * This is the top level routine of the printer. 'p' points + * to the TR header of the packet, 'h->ts' is the timestamp, + * 'h->length' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + */ +u_int +token_if_print(const struct pcap_pkthdr *h, const u_char *p) +{ + return (token_print(p, h->len, h->caplen)); } |