]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Add printers for the Hilscher Ethernet link-layer types.
authorGuy Harris <[email protected]>
Thu, 15 Sep 2011 19:56:17 +0000 (12:56 -0700)
committerGuy Harris <[email protected]>
Thu, 15 Sep 2011 19:58:05 +0000 (12:58 -0700)
netdissect.h
print-ether.c
tcpdump.c

index 6834f95df181a8654642e42fa06ffe18049435aa..501f5a7145678cdbc7fb8278e3fc89fbe2179aec 100644 (file)
@@ -298,7 +298,12 @@ extern void ether_print(netdissect_options *,
                         const u_char *);
 
 extern u_int ether_if_print(netdissect_options *, 
-                           const struct pcap_pkthdr *,const u_char *);
+                            const struct pcap_pkthdr *,const u_char *);
+extern u_int ether_hilscher_if_print(netdissect_options *, 
+                                     const struct pcap_pkthdr *,const u_char *);
+extern u_int ether_hilscher_transparent_if_print(netdissect_options *, 
+                                                 const struct pcap_pkthdr *,
+                                                 const u_char *);
 
 extern int ethertype_print(netdissect_options *,u_short, const u_char *,
                             u_int, u_int);
index 8727bff59d3dcdb7ebd881aba69a359b63af2724..087b0e4d9d4943bdeb6c41538302e16de4ebd031 100644 (file)
@@ -252,6 +252,63 @@ ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
        return (ETHER_HDRLEN);
 }
 
+/*
+ * This is the top level routine of the printer.  'p' points
+ * to the ether header of the packet, 'h->ts' is the timestamp,
+ * 'h->len' is the length of the packet off the wire, and 'h->caplen'
+ * is the number of bytes actually captured.
+ *
+ * This is for DLT_ETHERNET_HILSCHER, which has a 4-byte pseudo-header
+ * before the Ethernet header.
+ */
+u_int
+ether_hilscher_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+                        const u_char *p)
+{
+       /*
+        * Fail if we don't have enough data for the Hilscher pseudo-header.
+        */
+       if (h->len < 4 || h->caplen < 4) {
+               printf("[|hilscher]");
+               return (h->caplen);
+       }
+
+       /* Skip the pseudo-header. */
+       ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL);
+
+       return (4 + ETHER_HDRLEN);
+}
+
+/*
+ * This is the top level routine of the printer.  'p' points
+ * to the ether header of the packet, 'h->ts' is the timestamp,
+ * 'h->len' is the length of the packet off the wire, and 'h->caplen'
+ * is the number of bytes actually captured.
+ *
+ * This is for DLT_ETHERNET_HILSCHER_TRANSPARENT, which has a 4-byte
+ * pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF
+ * before the Ethernet header.
+ */
+u_int
+ether_hilscher_transparent_if_print(netdissect_options *ndo,
+                                    const struct pcap_pkthdr *h,
+                                    const u_char *p)
+{
+       /*
+        * Fail if we don't have enough data for the Hilscher pseudo-header,
+        * preamble, and SOF.
+        */
+       if (h->len < 12 || h->caplen < 12) {
+               printf("[|hilscher-transparent]");
+               return (h->caplen);
+       }
+
+       /* Skip the pseudo-header, preamble, and SOF. */
+       ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL);
+
+       return (12 + ETHER_HDRLEN);
+}
+
 /*
  * Prints the packet payload, given an Ethernet type code for the payload's
  * protocol.
index fe9227075c10a867e09ca0332cf20b8dc01304e3..37ac27a76874aaffabb7bdd3748500c8ccb3515a 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -314,6 +314,12 @@ static struct ndo_printer ndo_printers[] = {
 #endif
 #ifdef DLT_PPI
        { ppi_if_print,         DLT_PPI },
+#endif
+#ifdef DLT_ETHERNET_HILSCHER
+       { ether_hilscher_if_print, DLT_ETHERNET_HILSCHER },
+#endif
+#ifdef DLT_ETHERNET_HILSCHER_TRANSPARENT
+       { ether_hilscher_transparent_if_print, DLT_ETHERNET_HILSCHER_TRANSPARENT },
 #endif
        { NULL,                 0 },
 };