]> The Tcpdump Group git mirrors - tcpdump/commitdiff
print of ATM LanEmulation. From Marko Kiiskila <[email protected]> by way of <kuznet...
authorassar <assar>
Sun, 21 Nov 1999 03:52:11 +0000 (03:52 +0000)
committerassar <assar>
Sun, 21 Nov 1999 03:52:11 +0000 (03:52 +0000)
lane.h [new file with mode: 0644]
print-cip.c [new file with mode: 0644]
print-lane.c [new file with mode: 0644]

diff --git a/lane.h b/lane.h
new file mode 100644 (file)
index 0000000..19431be
--- /dev/null
+++ b/lane.h
@@ -0,0 +1,34 @@
+/*
+ * Marko Kiiskila [email protected] 
+ * 
+ * Tampere University of Technology - Telecommunications Laboratory
+ *
+ * Permission to use, copy, modify and distribute this
+ * software and its documentation is hereby granted,
+ * provided that both the copyright notice and this
+ * permission notice appear in all copies of the software,
+ * derivative works or modified versions, and any portions
+ * thereof, that both notices appear in supporting
+ * documentation, and that the use of this software is
+ * acknowledged in any publications resulting from using
+ * the software.
+ * 
+ * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
+ * SOFTWARE.
+ * 
+ */
+
+/* $Id: lane.h,v 1.1 1999-11-21 03:52:11 assar Exp $ */
+
+#ifndef ETHER_ADDR_LEN
+#define ETHER_ADDR_LEN ETH_ALEN
+#endif
+
+struct lecdatahdr_8023 {
+  u_short le_header;
+  u_char h_dest[ETHER_ADDR_LEN];
+  u_char h_source[ETHER_ADDR_LEN];
+  u_short h_type;
+};
diff --git a/print-cip.c b/print-cip.c
new file mode 100644 (file)
index 0000000..aeeae2d
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Marko Kiiskila [email protected] 
+ * 
+ * Tampere University of Technology - Telecommunications Laboratory
+ *
+ * Permission to use, copy, modify and distribute this
+ * software and its documentation is hereby granted,
+ * provided that both the copyright notice and this
+ * permission notice appear in all copies of the software,
+ * derivative works or modified versions, and any portions
+ * thereof, that both notices appear in supporting
+ * documentation, and that the use of this software is
+ * acknowledged in any publications resulting from using
+ * the software.
+ * 
+ * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
+ * SOFTWARE.
+ * 
+ */
+
+#ifndef lint
+static const char rcsid[] =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-cip.c,v 1.1 1999-11-21 03:52:22 assar Exp $ (LBL)";
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/udp.h>
+#include <netinet/udp_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcpip.h>
+
+#include <stdio.h>
+#include <pcap.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+
+const u_char *packetp;
+const u_char *snapend;
+
+#define RFC1483LLC_LEN 8 
+
+static unsigned char rfcllc[] = {
+  0xaa,   /* DSAP: non-ISO */
+  0xaa,   /* SSAP: non-ISO */
+  0x03,   /* Ctrl: Unnumbered Information Command PDU */
+  0x00,   /* OUI: EtherType */
+  0x00,
+  0x00 };
+
+static inline void
+cip_print(register const u_char *bp, int length)
+{
+  int i;
+
+  if (memcmp(rfcllc, bp, sizeof(rfcllc))) {
+    if (qflag) {
+      for(i=0;i<RFC1483LLC_LEN;i++)
+       (void)printf("%2.2x ",bp[i]);
+    } else {
+      for(i=0;i<RFC1483LLC_LEN-2;i++)
+       (void)printf("%2.2x ",bp[i]);
+      etherproto_string(((u_short*)bp)[3]);
+    } 
+  } else {
+    if (qflag)
+      (void)printf("(null encapsulation)");
+    else {
+      (void)printf("(null encap)");
+      etherproto_string(ETHERTYPE_IP);
+    }
+  }
+}
+
+/*
+ * This is the top level routine of the printer.  'p' is the points
+ * to the raw header of the packet, 'tvp' is the timestamp,
+ * 'length' is the length of the packet off the wire, and 'caplen'
+ * is the number of bytes actually captured.
+ */
+void
+cip_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
+{
+       int caplen = h->caplen;
+       int length = h->len;
+       u_short ether_type;
+       u_short extracted_ethertype;
+       u_short *bp;
+
+       ts_print(&h->ts);
+
+       if (memcmp(rfcllc, p, sizeof(rfcllc))==0 && caplen < RFC1483LLC_LEN) {
+               printf("[|cip]");
+               goto out;
+       }
+
+       if (eflag)
+         cip_print(p, length);
+
+       /*
+        * Some printers want to get back at the ethernet addresses,
+        * and/or check that they're not walking off the end of the packet.
+        * Rather than pass them all the way down, we set these globals.
+        */
+       packetp = p;
+       snapend = p + caplen;
+
+       if (memcmp(rfcllc, p, sizeof(rfcllc))==0) {
+         length -= RFC1483LLC_LEN;
+         caplen -= RFC1483LLC_LEN;
+         bp = (u_short*)p;
+         p += RFC1483LLC_LEN;
+         ether_type = ntohs(bp[3]);
+       } else
+         ether_type = ETHERTYPE_IP;
+
+       /*
+        * Is it (gag) an 802.3 encapsulation?
+        */
+       extracted_ethertype = 0;
+       if (ether_type < ETHERMTU) {
+               /* Try to print the LLC-layer header & higher layers */
+               if (llc_print(p, length, caplen, NULL, NULL)==0) {
+                       /* ether_type not known, print raw packet */
+                       if (!eflag)
+                               cip_print((u_char *)bp, length);
+                       if (extracted_ethertype) {
+                               printf("(LLC %s) ",
+                              etherproto_string(htons(extracted_ethertype)));
+                       }
+                       if (!xflag && !qflag)
+                               default_print(p, caplen);
+               }
+       } else if (ether_encap_print(ether_type, p, length, caplen) == 0) {
+               /* ether_type not known, print raw packet */
+               if (!eflag)
+                       cip_print((u_char *)bp, length + RFC1483LLC_LEN);
+               if (!xflag && !qflag)
+                       default_print(p, caplen);
+       }
+       if (xflag)
+               default_print(p, caplen);
+ out:
+       putchar('\n');
+}
diff --git a/print-lane.c b/print-lane.c
new file mode 100644 (file)
index 0000000..cdab8dc
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Marko Kiiskila [email protected] 
+ * 
+ * Tampere University of Technology - Telecommunications Laboratory
+ *
+ * Permission to use, copy, modify and distribute this
+ * software and its documentation is hereby granted,
+ * provided that both the copyright notice and this
+ * permission notice appear in all copies of the software,
+ * derivative works or modified versions, and any portions
+ * thereof, that both notices appear in supporting
+ * documentation, and that the use of this software is
+ * acknowledged in any publications resulting from using
+ * the software.
+ * 
+ * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
+ * SOFTWARE.
+ * 
+ */
+
+#ifndef lint
+static const char rcsid[] =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-lane.c,v 1.1 1999-11-21 03:52:11 assar Exp $ (LBL)";
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/udp.h>
+#include <netinet/udp_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcpip.h>
+
+#include <stdio.h>
+#include <pcap.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "lane.h"
+
+static const u_char *packetp;
+static const u_char *snapend;
+
+static inline void
+lane_print(register const u_char *bp, int length)
+{
+       register const struct lecdatahdr_8023 *ep;
+
+       ep = (const struct lecdatahdr_8023 *)bp;
+       if (qflag)
+               (void)printf("lecid:%d %s %s %d: ",
+                            ntohs(ep->le_header),
+                            etheraddr_string(ep->h_source),
+                            etheraddr_string(ep->h_dest),
+                            length);
+       else
+               (void)printf("lecid:%d %s %s %s %d: ",
+                            ntohs(ep->le_header),
+                            etheraddr_string(ep->h_source),
+                            etheraddr_string(ep->h_dest),
+                            etherproto_string(ep->h_type),
+                            length);
+}
+
+/*
+ * This is the top level routine of the printer.  'p' is the points
+ * to the ether header of the packet, 'h->tv' is the timestamp,
+ * 'h->length' is the length of the packet off the wire, and 'h->caplen'
+ * is the number of bytes actually captured.
+ */
+void
+lane_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
+{
+       int caplen = h->caplen;
+       int length = h->len;
+       struct lecdatahdr_8023 *ep;
+       u_short ether_type;
+       u_short extracted_ethertype;
+
+       ts_print(&h->ts);
+
+       if (caplen < sizeof(struct lecdatahdr_8023)) {
+               printf("[|lane]");
+               goto out;
+       }
+
+       if (eflag)
+               lane_print(p, length);
+
+       /*
+        * Some printers want to get back at the ethernet addresses,
+        * and/or check that they're not walking off the end of the packet.
+        * Rather than pass them all the way down, we set these globals.
+        */
+       packetp = p;
+       snapend = p + caplen;
+
+       length -= sizeof(struct lecdatahdr_8023);
+       caplen -= sizeof(struct lecdatahdr_8023);
+       ep = (struct lecdatahdr_8023 *)p;
+       p += sizeof(struct lecdatahdr_8023);
+
+       ether_type = ntohs(ep->h_type);
+
+       /*
+        * Is it (gag) an 802.3 encapsulation?
+        */
+       extracted_ethertype = 0;
+       if (ether_type < ETHERMTU) {
+               /* Try to print the LLC-layer header & higher layers */
+               if (llc_print(p, length, caplen, ep->h_source,ep->h_dest)==0) {
+                       /* ether_type not known, print raw packet */
+                       if (!eflag)
+                               lane_print((u_char *)ep, length);
+                       if (extracted_ethertype) {
+                               printf("(LLC %s) ",
+                              etherproto_string(htons(extracted_ethertype)));
+                       }
+                       if (!xflag && !qflag)
+                               default_print(p, caplen);
+               }
+       } else if (ether_encap_print(ether_type, p, length, caplen) == 0) {
+               /* ether_type not known, print raw packet */
+               if (!eflag)
+                       lane_print((u_char *)ep, length + sizeof(*ep));
+               if (!xflag && !qflag)
+                       default_print(p, caplen);
+       }
+       if (xflag)
+               default_print(p, caplen);
+ out:
+       putchar('\n');
+}