⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print-token.c

📁 Windump3.6.2源代码
💻 C
字号:
/* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Hacked version of print-ether.c  Larry Lile <lile@stdio.com> * * Further tweaked to more closely resemble print-fddi.c *	Guy Harris <guy@alum.mit.edu> */#ifndef lintstatic const char rcsid[] =    "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.11 2000/12/23 20:48:13 guy Exp $";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifndef WIN32
#include <sys/param.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#else
#include <winsock2.h>
#include "bittypes.h"
#include <time.h>
#endif /* WIN32 */
#include <pcap.h>#include <stdio.h>#include <string.h>#include "interface.h"#include "addrtoname.h"#include "ethertype.h"#include "ether.h"#include "token.h"/* Extract src, dst addresses */static inline voidextract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst){	memcpy(fdst, (char *)trp->token_dhost, 6);	memcpy(fsrc, (char *)trp->token_shost, 6);}/* * Print the TR MAC header */static inline voidtoken_print(register const struct token_header *trp, register u_int length,	   register const u_char *fsrc, register const u_char *fdst){	char *srcname, *dstname;	srcname = etheraddr_string(fsrc);	dstname = etheraddr_string(fdst);	if (vflag)		(void) printf("%02x %02x %s %s %d: ",		       trp->token_ac,		       trp->token_fc,		       srcname, dstname,		       length);	else		printf("%s %s %d: ", srcname, dstname, length);}static char *broadcast_indicator[] = {	"Non-Broadcast", "Non-Broadcast",	"Non-Broadcast", "Non-Broadcast",	"All-routes",    "All-routes",	"Single-route",  "Single-route"};static char *direction[] = {	"Forward", "Backward"};static char *largest_frame[] = {	"516",	"1500",	"2052",	"4472",	"8144",	"11407",	"17800",	"??"};/* * 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. */voidtoken_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p){	u_int caplen = h->caplen;	u_int length = h->len;	struct token_header *trp;	u_short extracted_ethertype;	struct ether_header ehdr;	u_int route_len = 0, seg;	trp = (struct token_header *)p;	ts_print(&h->ts);	if (caplen < TOKEN_HDRLEN) {		printf("[|token-ring]");		goto out;	}	/*	 * 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)) {		/* Clear source-routed bit */		*ESRC(&ehdr) &= 0x7f;		if (eflag)			token_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));	}	/* Skip over token ring MAC header and routing information */	length -= TOKEN_HDRLEN + route_len;	p += TOKEN_HDRLEN + route_len;	caplen -= TOKEN_HDRLEN + route_len;	/* Frame Control field determines interpretation of packet */	extracted_ethertype = 0;	if (FRAME_TYPE(trp) == TOKEN_FC_LLC) {		/* Try to print the LLC-layer header & higher layers */		if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr),		    &extracted_ethertype) == 0) {			/* ether_type not known, print raw packet */			if (!eflag)				token_print(trp,				    length + TOKEN_HDRLEN + route_len,				    ESRC(&ehdr), EDST(&ehdr));			if (extracted_ethertype) {				printf("(LLC %s) ",			etherproto_string(htons(extracted_ethertype)));			}			if (!xflag && !qflag)				default_print(p, caplen);		}	} else {		/* 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,			    ESRC(&ehdr), EDST(&ehdr));		if (!xflag && !qflag)			default_print(p, caplen);	}	if (xflag)		default_print(p, caplen);out:	putchar('\n');}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -