1 /* 2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that: (1) source code distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 */ 21 #include <sys/cdefs.h> 22 #ifndef lint 23 #if 0 24 static const char rcsid[] _U_ = 25 "@(#) Header: /tcpdump/master/tcpdump/print-ap1394.c,v 1.5 2006-02-11 22:12:06 hannes Exp (LBL)"; 26 #else 27 __RCSID("$NetBSD: print-ap1394.c,v 1.3 2013/04/06 19:33:08 christos Exp $"); 28 #endif 29 #endif 30 31 #ifdef HAVE_CONFIG_H 32 #include "config.h" 33 #endif 34 35 #include <tcpdump-stdinc.h> 36 37 #include <stdio.h> 38 #include <pcap.h> 39 40 #include "interface.h" 41 #include "extract.h" 42 #include "addrtoname.h" 43 #include "ethertype.h" 44 45 /* 46 * Structure of a header for Apple's IP-over-IEEE 1384 BPF header. 47 */ 48 #define FIREWIRE_EUI64_LEN 8 49 struct firewire_header { 50 u_char firewire_dhost[FIREWIRE_EUI64_LEN]; 51 u_char firewire_shost[FIREWIRE_EUI64_LEN]; 52 u_short firewire_type; 53 }; 54 55 /* 56 * Length of that header; note that some compilers may pad 57 * "struct firewire_header" to a multiple of 4 bytes, for example, so 58 * "sizeof (struct firewire_header)" may not give the right answer. 59 */ 60 #define FIREWIRE_HDRLEN 18 61 62 static inline void 63 ap1394_hdr_print(register const u_char *bp, u_int length) 64 { 65 register const struct firewire_header *fp; 66 u_int16_t firewire_type; 67 68 fp = (const struct firewire_header *)bp; 69 70 (void)printf("%s > %s", 71 linkaddr_string(fp->firewire_dhost, LINKADDR_IEEE1394, FIREWIRE_EUI64_LEN), 72 linkaddr_string(fp->firewire_shost, LINKADDR_IEEE1394, FIREWIRE_EUI64_LEN)); 73 74 firewire_type = EXTRACT_16BITS(&fp->firewire_type); 75 if (!qflag) { 76 (void)printf(", ethertype %s (0x%04x)", 77 tok2str(ethertype_values,"Unknown", firewire_type), 78 firewire_type); 79 } else { 80 (void)printf(", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", firewire_type)); 81 } 82 83 (void)printf(", length %u: ", length); 84 } 85 86 /* 87 * This is the top level routine of the printer. 'p' points 88 * to the ether header of the packet, 'h->ts' is the timestamp, 89 * 'h->len' is the length of the packet off the wire, and 'h->caplen' 90 * is the number of bytes actually captured. 91 */ 92 u_int 93 ap1394_if_print(const struct pcap_pkthdr *h, const u_char *p) 94 { 95 u_int length = h->len; 96 u_int caplen = h->caplen; 97 struct firewire_header *fp; 98 u_short ether_type; 99 100 if (caplen < FIREWIRE_HDRLEN) { 101 printf("[|ap1394]"); 102 return FIREWIRE_HDRLEN; 103 } 104 105 if (eflag) 106 ap1394_hdr_print(p, length); 107 108 length -= FIREWIRE_HDRLEN; 109 caplen -= FIREWIRE_HDRLEN; 110 fp = (struct firewire_header *)p; 111 p += FIREWIRE_HDRLEN; 112 113 ether_type = EXTRACT_16BITS(&fp->firewire_type); 114 if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) { 115 /* ether_type not known, print raw packet */ 116 if (!eflag) 117 ap1394_hdr_print((u_char *)fp, length + FIREWIRE_HDRLEN); 118 119 if (!suppress_default_print) 120 default_print(p, caplen); 121 } 122 123 return FIREWIRE_HDRLEN; 124 } 125