]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Add support for RFC 2625 IP-over-Fibre Channel.
authorguy <guy>
Fri, 18 Oct 2002 09:17:46 +0000 (09:17 +0000)
committerguy <guy>
Fri, 18 Oct 2002 09:17:46 +0000 (09:17 +0000)
FILES
Makefile.in
interface.h
ipfc.h [new file with mode: 0644]
print-ipfc.c [new file with mode: 0644]
tcpdump.c
win32/prj/GNUmakefile
win32/prj/WinDump.dsp

diff --git a/FILES b/FILES
index ba5ce531908a07bad760ecbb0d36685cb0702f67..a32826b682f5717136fe45d5880f51a95cd4e1a8 100644 (file)
--- a/FILES
+++ b/FILES
@@ -39,6 +39,7 @@ install-sh
 interface.h
 ip.h
 ip6.h
+ipfc.h
 ipsec_doi.h
 ipx.h
 isakmp.h
@@ -113,6 +114,7 @@ print-ip.c
 print-ip6.c
 print-ip6opts.c
 print-ipcomp.c
+print-ipfc.c
 print-ipx.c
 print-isakmp.c
 print-isoclns.c
index 9db5c300b1f885f2c6b2d0313cff059bbb71657d..0c29326dd6b1d4f02326d4f55d12468c945ce3e6 100644 (file)
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.267 2002-10-03 16:00:33 hannes Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.268 2002-10-18 09:17:47 guy Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -73,17 +73,18 @@ CSRC =      addrtoname.c gmt2local.c machdep.c parsenfsfh.c \
        print-dvmrp.c print-egp.c print-esp.c print-ether.c \
        print-fddi.c print-fr.c print-gre.c print-hsrp.c \
        print-icmp.c print-igmp.c print-igrp.c print-ip.c \
-       print-ipcomp.c print-ipx.c print-isakmp.c print-isoclns.c \
-       print-krb.c print-l2tp.c print-lane.c print-llc.c \
-       print-lwres.c print-msdp.c print-mobile.c print-mpls.c \
-       print-nfs.c print-ntp.c print-null.c print-ospf.c \
-       print-pflog.c print-pim.c print-ppp.c print-pppoe.c \
-       print-pptp.c print-radius.c print-raw.c print-rip.c print-rsvp.c \
-       print-rx.c print-sctp.c print-sl.c print-sll.c \
-       print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \
-       print-tcp.c print-telnet.c print-tftp.c print-timed.c \
-       print-token.c print-udp.c print-vjc.c print-vrrp.c \
-       print-wb.c print-zephyr.c setsignal.c tcpdump.c util.c
+       print-ipcomp.c print-ipfc.c print-ipx.c print-isakmp.c \
+       print-isoclns.c print-krb.c print-l2tp.c print-lane.c \
+       print-llc.c print-lwres.c print-msdp.c print-mobile.c \
+       print-mpls.c print-nfs.c print-ntp.c print-null.c \
+       print-ospf.c print-pflog.c print-pim.c print-ppp.c \
+       print-pppoe.c print-pptp.c print-radius.c print-raw.c \
+       print-rip.c print-rsvp.c print-rx.c print-sctp.c \
+       print-sl.c print-sll.c print-snmp.c print-stp.c \
+       print-sunatm.c print-sunrpc.c print-tcp.c print-telnet.c \
+       print-tftp.c print-timed.c print-token.c print-udp.c \
+       print-vjc.c print-vrrp.c print-wb.c print-zephyr.c \
+       setsignal.c tcpdump.c util.c
 
 LOCALSRC = @LOCALSRC@
 GENSRC = version.c
index 8d01dfb560122581602fba0a86f893562f5ae5d1..209788242e4ce85fe1cd50b1c09f7d02f9b6d4a9 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.195 2002-10-03 16:00:33 hannes Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.196 2002-10-18 09:17:47 guy Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -205,7 +205,6 @@ extern void arp_print(const u_char *, u_int, u_int);
 extern void atalk_print(const u_char *, u_int);
 extern void atm_print(u_int, u_int, u_int, const u_char *, u_int, u_int);
 extern void atm_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
-extern void bpfatm_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
 extern void sunatm_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
 extern void bootp_print(const u_char *, u_short, u_short);
 extern void bgp_print(const u_char *, int);
@@ -237,6 +236,7 @@ extern void igmp_print(const u_char *, u_int);
 extern void igrp_print(const u_char *, u_int, const u_char *);
 extern void ip_print(const u_char *, u_int);
 extern void ipN_print(const u_char *, u_int);
+extern void ipfc_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
 extern void ipx_print(const u_char *, u_int);
 extern void isoclns_print(const u_char *, u_int, u_int, const u_char *,
        const u_char *);
diff --git a/ipfc.h b/ipfc.h
new file mode 100644 (file)
index 0000000..ab169f5
--- /dev/null
+++ b/ipfc.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+ * the University nor the names of its contributors may be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * @(#) $Header: /tcpdump/master/tcpdump/ipfc.h,v 1.1 2002-10-18 09:17:47 guy Exp $ (LBL)
+ */
+
+struct ipfc_header {
+       u_char  ipfc_dhost[8];
+       u_char  ipfc_shost[8];
+};
+
+#define IPFC_HDRLEN 16
+
+/* Useful values for fddi_fc (frame control) field */
+
+/*
+ * FDDI Frame Control bits
+ */
+#define        FDDIFC_C                0x80            /* Class bit */
+#define        FDDIFC_L                0x40            /* Address length bit */
+#define        FDDIFC_F                0x30            /* Frame format bits */
+#define        FDDIFC_Z                0x0f            /* Control bits */
+
+/*
+ * FDDI Frame Control values. (48-bit addressing only).
+ */
+#define        FDDIFC_VOID             0x40            /* Void frame */
+#define        FDDIFC_NRT              0x80            /* Nonrestricted token */
+#define        FDDIFC_RT               0xc0            /* Restricted token */
+#define        FDDIFC_SMT_INFO         0x41            /* SMT Info */
+#define        FDDIFC_SMT_NSA          0x4F            /* SMT Next station adrs */
+#define        FDDIFC_MAC_BEACON       0xc2            /* MAC Beacon frame */
+#define        FDDIFC_MAC_CLAIM        0xc3            /* MAC Claim frame */
+#define        FDDIFC_LLC_ASYNC        0x50            /* Async. LLC frame */
+#define        FDDIFC_LLC_SYNC         0xd0            /* Sync. LLC frame */
+#define        FDDIFC_IMP_ASYNC        0x60            /* Implementor Async. */
+#define        FDDIFC_IMP_SYNC         0xe0            /* Implementor Synch. */
+#define FDDIFC_SMT             0x40            /* SMT frame */
+#define FDDIFC_MAC             0xc0            /* MAC frame */
+
+#define        FDDIFC_CLFF             0xF0            /* Class/Length/Format bits */
+#define        FDDIFC_ZZZZ             0x0F            /* Control bits */
diff --git a/print-ipfc.c b/print-ipfc.c
new file mode 100644 (file)
index 0000000..bcad6c3
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+ * the University nor the names of its contributors may be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-ipfc.c,v 1.1 2002-10-18 09:17:48 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <pcap.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "ethertype.h"
+
+#include "ether.h"
+#include "ipfc.h"
+
+/*
+ * RFC 2625 IP-over-Fibre Channel.
+ */
+
+/* Extract src, dst addresses */
+static inline void
+extract_ipfc_addrs(const struct ipfc_header *ipfcp, char *ipfcsrc,
+    char *ipfcdst)
+{
+       /*
+        * We assume that, as per RFC 2625, the lower 48 bits of the
+        * source and destination addresses are MAC addresses.
+        */
+       memcpy(ipfcdst, (const char *)&ipfcp->ipfc_dhost[2], 6);
+       memcpy(ipfcsrc, (const char *)&ipfcp->ipfc_shost[2], 6);
+}
+
+/*
+ * Print the Network_Header
+ */
+static inline void
+ipfc_hdr_print(register const struct ipfc_header *ipfcp _U_,
+          register u_int length, register const u_char *ipfcsrc,
+          register const u_char *ipfcdst)
+{
+       const char *srcname, *dstname;
+
+       srcname = etheraddr_string(ipfcsrc);
+       dstname = etheraddr_string(ipfcdst);
+
+       /*
+        * XXX - show the upper 16 bits?  Do so only if "vflag" is set?
+        */
+       (void) printf("%s %s %d: ", srcname, dstname, length);
+}
+
+static void
+ipfc_print(const u_char *p, u_int length, u_int caplen)
+{
+       const struct ipfc_header *ipfcp = (const struct ipfc_header *)p;
+       struct ether_header ehdr;
+       u_short extracted_ethertype;
+
+       if (caplen < IPFC_HDRLEN) {
+               printf("[|ipfc]");
+               return;
+       }
+       /*
+        * Get the network addresses into a canonical form
+        */
+       extract_ipfc_addrs(ipfcp, (char *)ESRC(&ehdr), (char *)EDST(&ehdr));
+       /*
+        * Some printers want to get back at the link level 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.
+        */
+       snapend = p + caplen;
+       /*
+        * Actually, the only printers that use packetp are print-arp.c
+        * and print-bootp.c, and they assume that packetp points to an
+        * Ethernet header.  The right thing to do is to fix them to know
+        * which link type is in use when they excavate. XXX
+        */
+       packetp = (u_char *)&ehdr;
+
+       if (eflag)
+               ipfc_hdr_print(ipfcp, length, ESRC(&ehdr), EDST(&ehdr));
+
+       /* Skip over Network_Header */
+       length -= IPFC_HDRLEN;
+       p += IPFC_HDRLEN;
+       caplen -= IPFC_HDRLEN;
+
+       /* Frame Control field determines interpretation of packet */
+       extracted_ethertype = 0;
+       /* Try to print the LLC-layer header & higher layers */
+       if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
+           &extracted_ethertype) == 0) {
+               /*
+                * Some kinds of LLC packet we cannot
+                * handle intelligently
+                */
+               if (!eflag)
+                       ipfc_hdr_print(ipfcp, length + IPFC_HDRLEN,
+                           ESRC(&ehdr), EDST(&ehdr));
+               if (extracted_ethertype) {
+                       printf("(LLC %s) ",
+               etherproto_string(htons(extracted_ethertype)));
+               }
+               if (!xflag && !qflag)
+                       default_print(p, caplen);
+       }
+}
+
+/*
+ * This is the top level routine of the printer.  'sp' is the points
+ * to the Network_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
+ipfc_if_print(u_char *pcap _U_, const struct pcap_pkthdr *h,
+             register const u_char *p)
+{
+       u_int caplen = h->caplen;
+       u_int length = h->len;
+
+       ++infodelay;
+       ts_print(&h->ts);
+
+       ipfc_print(p, length, caplen);
+
+       /*
+        * If "-x" was specified, print stuff past the Network_Header,
+        * if there's anything to print.
+        */
+       if (xflag && caplen > IPFC_HDRLEN)
+               default_print(p + IPFC_HDRLEN, caplen - IPFC_HDRLEN);
+
+       putchar('\n');
+
+       --infodelay;
+       if (infoprint)
+               info(0);
+}
index 8f2e5e3a7e64f19b1de79991a86d171e1a8bd774..27a006f193393be20e67f2bad692215902fa6d07 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -30,7 +30,7 @@ static const char copyright[] =
     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.186 2002-09-05 21:25:51 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.187 2002-10-18 09:17:48 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -174,6 +174,9 @@ static struct printer printers[] = {
 #endif
 #ifdef DLT_SUNATM
        { sunatm_if_print,      DLT_SUNATM },
+#endif
+#ifdef DLT_IP_OVER_FC
+       { ipfc_if_print,        DLT_IP_OVER_FC },
 #endif
        { NULL,                 0 },
 };
index 7a0404e0bdeac911288f412a9afc266e6bd6dc88..d768fc5869f34f13b4c5a4b4c8d2681c9c0306dc 100644 (file)
@@ -62,6 +62,7 @@ OBJS = \
        ../../print-ip6.o \
        ../../print-ip6opts.o \
        ../../print-ipcomp.o \
+       ../../print-ipfc.o \
        ../../print-ipx.o \
        ../../print-isakmp.o \
        ../../print-isoclns.o \
index 8b489b79388353df281f137e5c11b2bd49e387f1..495aaaeb54e26bc6cf1620c6d6473a3fb956b894 100644 (file)
@@ -257,6 +257,10 @@ SOURCE="..\..\print-ipcomp.c"
 # End Source File
 # Begin Source File
 
+SOURCE="..\..\print-ipfc.c"
+# End Source File
+# Begin Source File
+
 SOURCE="..\..\print-ipx.c"
 # End Source File
 # Begin Source File