1722012ccSJulian Elischer /* 2722012ccSJulian Elischer * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 3722012ccSJulian Elischer * The Regents of the University of California. All rights reserved. 4722012ccSJulian Elischer * 5722012ccSJulian Elischer * Redistribution and use in source and binary forms, with or without 6722012ccSJulian Elischer * modification, are permitted provided that: (1) source code distributions 7722012ccSJulian Elischer * retain the above copyright notice and this paragraph in its entirety, (2) 8722012ccSJulian Elischer * distributions including binary code include the above copyright notice and 9722012ccSJulian Elischer * this paragraph in its entirety in the documentation or other materials 10722012ccSJulian Elischer * provided with the distribution, and (3) all advertising materials mentioning 11722012ccSJulian Elischer * features or use of this software display the following acknowledgement: 12722012ccSJulian Elischer * ``This product includes software developed by the University of California, 13722012ccSJulian Elischer * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14722012ccSJulian Elischer * the University nor the names of its contributors may be used to endorse 15722012ccSJulian Elischer * or promote products derived from this software without specific prior 16722012ccSJulian Elischer * written permission. 17722012ccSJulian Elischer * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18722012ccSJulian Elischer * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19722012ccSJulian Elischer * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20722012ccSJulian Elischer * 21722012ccSJulian Elischer * Hacked version of print-ether.c Larry Lile <lile@stdio.com> 22a88113a8SBill Fenner * 23a1c2090eSBill Fenner * Further tweaked to more closely resemble print-fddi.c 24a1c2090eSBill Fenner * Guy Harris <guy@alum.mit.edu> 25a1c2090eSBill Fenner * 26a88113a8SBill Fenner * $FreeBSD$ 27722012ccSJulian Elischer */ 28722012ccSJulian Elischer #ifndef lint 29cc391cceSBruce M Simpson static const char rcsid[] _U_ = 30c1ad1296SSam Leffler "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.25 2004/03/17 23:24:38 guy Exp $"; 31a1c2090eSBill Fenner #endif 32a1c2090eSBill Fenner 33a1c2090eSBill Fenner #ifdef HAVE_CONFIG_H 34a1c2090eSBill Fenner #include "config.h" 35722012ccSJulian Elischer #endif 36722012ccSJulian Elischer 37cc391cceSBruce M Simpson #include <tcpdump-stdinc.h> 38722012ccSJulian Elischer 39722012ccSJulian Elischer #include <pcap.h> 40a1c2090eSBill Fenner #include <stdio.h> 41a1c2090eSBill Fenner #include <string.h> 42722012ccSJulian Elischer 43722012ccSJulian Elischer #include "interface.h" 44722012ccSJulian Elischer #include "addrtoname.h" 45722012ccSJulian Elischer #include "ethertype.h" 46722012ccSJulian Elischer 47a1c2090eSBill Fenner #include "ether.h" 48a1c2090eSBill Fenner #include "token.h" 49722012ccSJulian Elischer 50a1c2090eSBill Fenner /* Extract src, dst addresses */ 51722012ccSJulian Elischer static inline void 52a1c2090eSBill Fenner extract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst) 53722012ccSJulian Elischer { 54a1c2090eSBill Fenner memcpy(fdst, (const char *)trp->token_dhost, 6); 55a1c2090eSBill Fenner memcpy(fsrc, (const char *)trp->token_shost, 6); 5614fffcebSLarry Lile } 57722012ccSJulian Elischer 58722012ccSJulian Elischer /* 59a1c2090eSBill Fenner * Print the TR MAC header 60722012ccSJulian Elischer */ 61a1c2090eSBill Fenner static inline void 62cc391cceSBruce M Simpson token_hdr_print(register const struct token_header *trp, register u_int length, 63a1c2090eSBill Fenner register const u_char *fsrc, register const u_char *fdst) 64a1c2090eSBill Fenner { 65a1c2090eSBill Fenner const char *srcname, *dstname; 66722012ccSJulian Elischer 67a1c2090eSBill Fenner srcname = etheraddr_string(fsrc); 68a1c2090eSBill Fenner dstname = etheraddr_string(fdst); 69a1c2090eSBill Fenner 70a1c2090eSBill Fenner if (vflag) 71a1c2090eSBill Fenner (void) printf("%02x %02x %s %s %d: ", 72a1c2090eSBill Fenner trp->token_ac, 73a1c2090eSBill Fenner trp->token_fc, 74a1c2090eSBill Fenner srcname, dstname, 75722012ccSJulian Elischer length); 76722012ccSJulian Elischer else 77a1c2090eSBill Fenner printf("%s %s %d: ", srcname, dstname, length); 78722012ccSJulian Elischer } 79722012ccSJulian Elischer 80a1c2090eSBill Fenner static const char *broadcast_indicator[] = { 81a1c2090eSBill Fenner "Non-Broadcast", "Non-Broadcast", 82a1c2090eSBill Fenner "Non-Broadcast", "Non-Broadcast", 83a1c2090eSBill Fenner "All-routes", "All-routes", 84a1c2090eSBill Fenner "Single-route", "Single-route" 85a1c2090eSBill Fenner }; 86a1c2090eSBill Fenner 87a1c2090eSBill Fenner static const char *direction[] = { 88a1c2090eSBill Fenner "Forward", "Backward" 89a1c2090eSBill Fenner }; 90a1c2090eSBill Fenner 91a1c2090eSBill Fenner static const char *largest_frame[] = { 92a1c2090eSBill Fenner "516", 93a1c2090eSBill Fenner "1500", 94a1c2090eSBill Fenner "2052", 95a1c2090eSBill Fenner "4472", 96a1c2090eSBill Fenner "8144", 97a1c2090eSBill Fenner "11407", 98a1c2090eSBill Fenner "17800", 99a1c2090eSBill Fenner "??" 100a1c2090eSBill Fenner }; 101a1c2090eSBill Fenner 102cc391cceSBruce M Simpson u_int 103cc391cceSBruce M Simpson token_print(const u_char *p, u_int length, u_int caplen) 104722012ccSJulian Elischer { 105a1c2090eSBill Fenner const struct token_header *trp; 106a88113a8SBill Fenner u_short extracted_ethertype; 107a1c2090eSBill Fenner struct ether_header ehdr; 108cc391cceSBruce M Simpson u_int route_len = 0, hdr_len = TOKEN_HDRLEN; 109cc391cceSBruce M Simpson int seg; 110722012ccSJulian Elischer 111a1c2090eSBill Fenner trp = (const struct token_header *)p; 112722012ccSJulian Elischer 113a1c2090eSBill Fenner if (caplen < TOKEN_HDRLEN) { 114722012ccSJulian Elischer printf("[|token-ring]"); 115cc391cceSBruce M Simpson return hdr_len; 116722012ccSJulian Elischer } 117cc391cceSBruce M Simpson 118a1c2090eSBill Fenner /* 119a1c2090eSBill Fenner * Get the TR addresses into a canonical form 120a1c2090eSBill Fenner */ 121a1c2090eSBill Fenner extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr)); 122722012ccSJulian Elischer 123722012ccSJulian Elischer /* Adjust for source routing information in the MAC header */ 124a1c2090eSBill Fenner if (IS_SOURCE_ROUTED(trp)) { 125a1c2090eSBill Fenner /* Clear source-routed bit */ 126a1c2090eSBill Fenner *ESRC(&ehdr) &= 0x7f; 12714fffcebSLarry Lile 12814fffcebSLarry Lile if (eflag) 129cc391cceSBruce M Simpson token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); 13014fffcebSLarry Lile 131a1c2090eSBill Fenner route_len = RIF_LENGTH(trp); 13214fffcebSLarry Lile if (vflag) { 133a1c2090eSBill Fenner printf("%s ", broadcast_indicator[BROADCAST(trp)]); 134a1c2090eSBill Fenner printf("%s", direction[DIRECTION(trp)]); 13514fffcebSLarry Lile 136a1c2090eSBill Fenner for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) 137a1c2090eSBill Fenner printf(" [%d:%d]", RING_NUMBER(trp, seg), 138a1c2090eSBill Fenner BRIDGE_NUMBER(trp, seg)); 13914fffcebSLarry Lile } else { 140a1c2090eSBill Fenner printf("rt = %x", ntohs(trp->token_rcf)); 14114fffcebSLarry Lile 142a1c2090eSBill Fenner for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) 143a1c2090eSBill Fenner printf(":%x", ntohs(trp->token_rseg[seg])); 14414fffcebSLarry Lile } 145a1c2090eSBill Fenner printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]); 14614fffcebSLarry Lile } else { 14714fffcebSLarry Lile if (eflag) 148cc391cceSBruce M Simpson token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); 149722012ccSJulian Elischer } 150722012ccSJulian Elischer 151a1c2090eSBill Fenner /* Skip over token ring MAC header and routing information */ 152cc391cceSBruce M Simpson hdr_len += route_len; 153cc391cceSBruce M Simpson length -= hdr_len; 154cc391cceSBruce M Simpson p += hdr_len; 155cc391cceSBruce M Simpson caplen -= hdr_len; 156722012ccSJulian Elischer 157a1c2090eSBill Fenner /* Frame Control field determines interpretation of packet */ 158722012ccSJulian Elischer extracted_ethertype = 0; 159a1c2090eSBill Fenner if (FRAME_TYPE(trp) == TOKEN_FC_LLC) { 160722012ccSJulian Elischer /* Try to print the LLC-layer header & higher layers */ 161a1c2090eSBill Fenner if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr), 162a1c2090eSBill Fenner &extracted_ethertype) == 0) { 163722012ccSJulian Elischer /* ether_type not known, print raw packet */ 164722012ccSJulian Elischer if (!eflag) 165cc391cceSBruce M Simpson token_hdr_print(trp, 166a1c2090eSBill Fenner length + TOKEN_HDRLEN + route_len, 167a1c2090eSBill Fenner ESRC(&ehdr), EDST(&ehdr)); 168722012ccSJulian Elischer if (extracted_ethertype) { 169722012ccSJulian Elischer printf("(LLC %s) ", 170722012ccSJulian Elischer etherproto_string(htons(extracted_ethertype))); 171722012ccSJulian Elischer } 172722012ccSJulian Elischer if (!xflag && !qflag) 173722012ccSJulian Elischer default_print(p, caplen); 174722012ccSJulian Elischer } 175a1c2090eSBill Fenner } else { 176a1c2090eSBill Fenner /* Some kinds of TR packet we cannot handle intelligently */ 177a1c2090eSBill Fenner /* XXX - dissect MAC packets if frame type is 0 */ 178a1c2090eSBill Fenner if (!eflag) 179cc391cceSBruce M Simpson token_hdr_print(trp, length + TOKEN_HDRLEN + route_len, 180a1c2090eSBill Fenner ESRC(&ehdr), EDST(&ehdr)); 181a1c2090eSBill Fenner if (!xflag && !qflag) 182a1c2090eSBill Fenner default_print(p, caplen); 183a1c2090eSBill Fenner } 184cc391cceSBruce M Simpson return (hdr_len); 185cc391cceSBruce M Simpson } 186cc391cceSBruce M Simpson 187cc391cceSBruce M Simpson /* 188cc391cceSBruce M Simpson * This is the top level routine of the printer. 'p' points 189cc391cceSBruce M Simpson * to the TR header of the packet, 'h->ts' is the timestamp, 190c1ad1296SSam Leffler * 'h->len' is the length of the packet off the wire, and 'h->caplen' 191cc391cceSBruce M Simpson * is the number of bytes actually captured. 192cc391cceSBruce M Simpson */ 193cc391cceSBruce M Simpson u_int 194cc391cceSBruce M Simpson token_if_print(const struct pcap_pkthdr *h, const u_char *p) 195cc391cceSBruce M Simpson { 196cc391cceSBruce M Simpson return (token_print(p, h->len, h->caplen)); 197722012ccSJulian Elischer } 198