print-token.c revision 2949f58a438f6fd85f66a8b7ed4708042cde4b37
12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Hacked version of print-ether.c Larry Lile <lile@stdio.com> 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Further tweaked to more closely resemble print-fddi.c 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Guy Harris <guy@alum.mit.edu> 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.25.2.2 2005/11/13 12:13:01 guy Exp $"; 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h" 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "token.h" 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Extract src, dst addresses */ 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst) 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(fdst, (const char *)trp->token_dhost, 6); 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(fsrc, (const char *)trp->token_shost, 6); 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the TR MAC header 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_hdr_print(register const struct token_header *trp, register u_int length, 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *fsrc, register const u_char *fdst) 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *srcname, *dstname; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project srcname = etheraddr_string(fsrc); 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dstname = etheraddr_string(fdst); 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void) printf("%02x %02x %s %s %d: ", 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trp->token_ac, 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trp->token_fc, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project srcname, dstname, 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s %s %d: ", srcname, dstname, length); 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *broadcast_indicator[] = { 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Non-Broadcast", "Non-Broadcast", 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Non-Broadcast", "Non-Broadcast", 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "All-routes", "All-routes", 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Single-route", "Single-route" 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *direction[] = { 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Forward", "Backward" 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *largest_frame[] = { 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "516", 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "1500", 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "2052", 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "4472", 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "8144", 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "11407", 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "17800", 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "??" 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_print(const u_char *p, u_int length, u_int caplen) 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct token_header *trp; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short extracted_ethertype; 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ether_header ehdr; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int route_len = 0, hdr_len = TOKEN_HDRLEN; 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int seg; 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trp = (const struct token_header *)p; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < TOKEN_HDRLEN) { 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|token-ring]"); 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdr_len; 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Get the TR addresses into a canonical form 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr)); 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Adjust for source routing information in the MAC header */ 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IS_SOURCE_ROUTED(trp)) { 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Clear source-routed bit */ 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *ESRC(&ehdr) &= 0x7f; 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eflag) 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project route_len = RIF_LENGTH(trp); 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s ", broadcast_indicator[BROADCAST(trp)]); 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", direction[DIRECTION(trp)]); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%d:%d]", RING_NUMBER(trp, seg), 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project BRIDGE_NUMBER(trp, seg)); 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("rt = %x", ntohs(trp->token_rcf)); 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(":%x", ntohs(trp->token_rseg[seg])); 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]); 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eflag) 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Skip over token ring MAC header and routing information */ 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdr_len += route_len; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= hdr_len; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += hdr_len; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caplen -= hdr_len; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Frame Control field determines interpretation of packet */ 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FRAME_TYPE(trp) == TOKEN_FC_LLC) { 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Try to print the LLC-layer header & higher layers */ 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr), 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &extracted_ethertype) == 0) { 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ether_type not known, print raw packet */ 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project token_hdr_print(trp, 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length + TOKEN_HDRLEN + route_len, 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ESRC(&ehdr), EDST(&ehdr)); 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (extracted_ethertype) { 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(LLC %s) ", 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etherproto_string(htons(extracted_ethertype))); 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!suppress_default_print) 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default_print(p, caplen); 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Some kinds of TR packet we cannot handle intelligently */ 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* XXX - dissect MAC packets if frame type is 0 */ 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project token_hdr_print(trp, length + TOKEN_HDRLEN + route_len, 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ESRC(&ehdr), EDST(&ehdr)); 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!suppress_default_print) 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default_print(p, caplen); 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (hdr_len); 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer. 'p' points 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the TR header of the packet, 'h->ts' is the timestamp, 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen' 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured. 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_if_print(const struct pcap_pkthdr *h, const u_char *p) 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (token_print(p, h->len, h->caplen)); 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 195