print-ap1394.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. /* \summary: Apple IP-over-IEEE 1394 printer */
  22. #ifdef HAVE_CONFIG_H
  23. #include "config.h"
  24. #endif
  25. #include <netdissect-stdinc.h>
  26. #include "netdissect.h"
  27. #include "extract.h"
  28. #include "addrtoname.h"
  29. #include "ethertype.h"
  30. /*
  31. * Structure of a header for Apple's IP-over-IEEE 1384 BPF header.
  32. */
  33. #define FIREWIRE_EUI64_LEN 8
  34. struct firewire_header {
  35. u_char firewire_dhost[FIREWIRE_EUI64_LEN];
  36. u_char firewire_shost[FIREWIRE_EUI64_LEN];
  37. u_short firewire_type;
  38. };
  39. /*
  40. * Length of that header; note that some compilers may pad
  41. * "struct firewire_header" to a multiple of 4 bytes, for example, so
  42. * "sizeof (struct firewire_header)" may not give the right answer.
  43. */
  44. #define FIREWIRE_HDRLEN 18
  45. static const char *
  46. fwaddr_string(netdissect_options *ndo, const u_char *addr)
  47. {
  48. return (linkaddr_string(ndo, addr, LINKADDR_IEEE1394, FIREWIRE_EUI64_LEN));
  49. }
  50. static inline void
  51. ap1394_hdr_print(netdissect_options *ndo, register const u_char *bp, u_int length)
  52. {
  53. register const struct firewire_header *fp;
  54. uint16_t firewire_type;
  55. fp = (const struct firewire_header *)bp;
  56. ND_PRINT((ndo, "%s > %s",
  57. fwaddr_string(ndo, fp->firewire_shost),
  58. fwaddr_string(ndo, fp->firewire_dhost)));
  59. firewire_type = EXTRACT_16BITS(&fp->firewire_type);
  60. if (!ndo->ndo_qflag) {
  61. ND_PRINT((ndo, ", ethertype %s (0x%04x)",
  62. tok2str(ethertype_values,"Unknown", firewire_type),
  63. firewire_type));
  64. } else {
  65. ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", firewire_type)));
  66. }
  67. ND_PRINT((ndo, ", length %u: ", length));
  68. }
  69. /*
  70. * This is the top level routine of the printer. 'p' points
  71. * to the ether header of the packet, 'h->ts' is the timestamp,
  72. * 'h->len' is the length of the packet off the wire, and 'h->caplen'
  73. * is the number of bytes actually captured.
  74. */
  75. u_int
  76. ap1394_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
  77. {
  78. u_int length = h->len;
  79. u_int caplen = h->caplen;
  80. const struct firewire_header *fp;
  81. u_short ether_type;
  82. struct lladdr_info src, dst;
  83. if (caplen < FIREWIRE_HDRLEN) {
  84. ND_PRINT((ndo, "[|ap1394]"));
  85. return FIREWIRE_HDRLEN;
  86. }
  87. if (ndo->ndo_eflag)
  88. ap1394_hdr_print(ndo, p, length);
  89. length -= FIREWIRE_HDRLEN;
  90. caplen -= FIREWIRE_HDRLEN;
  91. fp = (const struct firewire_header *)p;
  92. p += FIREWIRE_HDRLEN;
  93. ether_type = EXTRACT_16BITS(&fp->firewire_type);
  94. src.addr = fp->firewire_shost;
  95. src.addr_string = fwaddr_string;
  96. dst.addr = fp->firewire_dhost;
  97. dst.addr_string = fwaddr_string;
  98. if (ethertype_print(ndo, ether_type, p, length, caplen, &src, &dst) == 0) {
  99. /* ether_type not known, print raw packet */
  100. if (!ndo->ndo_eflag)
  101. ap1394_hdr_print(ndo, (const u_char *)fp, length + FIREWIRE_HDRLEN);
  102. if (!ndo->ndo_suppress_default_print)
  103. ND_DEFAULTPRINT(p, caplen);
  104. }
  105. return FIREWIRE_HDRLEN;
  106. }