dect
/
libpcap
Archived
13
0
Fork 0

Add support for RFC 2625 IP-over-Fibre Channel, mapping all the Linux

ARPHRD_FC* types to it.
This commit is contained in:
guy 2002-10-18 08:46:13 +00:00
parent f8a3b72cd9
commit d1d0fe1d98
5 changed files with 106 additions and 12 deletions

View File

@ -37,7 +37,7 @@
*
* @(#)bpf.h 7.1 (Berkeley) 5/7/91
*
* @(#) $Header: /tcpdump/master/libpcap/bpf/net/Attic/bpf.h,v 1.62 2002-10-09 13:28:27 hannes Exp $ (LBL)
* @(#) $Header: /tcpdump/master/libpcap/bpf/net/Attic/bpf.h,v 1.63 2002-10-18 08:46:15 guy Exp $ (LBL)
*/
#ifndef BPF_MAJOR_VERSION
@ -340,8 +340,7 @@ struct bpf_hdr {
#define DLT_HHDLC 121
/*
* Reserved for RFC 2625 IP-over-Fibre Channel, as per a request from
* Don Lee <donlee@cray.com>.
* This is for RFC 2625 IP-over-Fibre Channel.
*
* This is not for use with raw Fibre Channel, where the link-layer
* header starts with a Fibre Channel frame header; it's for IP-over-FC,

View File

@ -21,7 +21,7 @@
*/
#ifndef lint
static const char rcsid[] =
"@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.179 2002-08-11 18:27:13 guy Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.180 2002-10-18 08:46:13 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@ -173,6 +173,7 @@ static struct block *gen_ehostop(const u_char *, int);
static struct block *gen_fhostop(const u_char *, int);
static struct block *gen_thostop(const u_char *, int);
static struct block *gen_wlanhostop(const u_char *, int);
static struct block *gen_ipfchostop(const u_char *, int);
static struct block *gen_dnhostop(bpf_u_int32, int, u_int);
static struct block *gen_host(bpf_u_int32, bpf_u_int32, int, int);
#ifdef INET6
@ -887,6 +888,22 @@ init_linktype(type)
off_nl_nosnap = 0; /* no 802.2 LLC */
return;
case DLT_IP_OVER_FC:
/*
* RFC 2625 IP-over-Fibre-Channel doesn't really have a
* link-level type field. We set "off_linktype" to the
* offset of the LLC header.
*
* To check for Ethernet types, we assume that SSAP = SNAP
* is being used and pick out the encapsulated Ethernet type.
* XXX - should we generate code to check for SNAP? RFC
* 2625 says SNAP should be used.
*/
off_linktype = 16;
off_nl = 24; /* IPFC+802.2+SNAP */
off_nl_nosnap = 19; /* IPFC+802.2 */
return;
case DLT_FRELAY:
/*
* XXX - we should set this to handle SNAP-encapsulated
@ -1130,6 +1147,7 @@ gen_linktype(proto)
case DLT_IEEE802:
case DLT_ATM_RFC1483:
case DLT_ATM_CLIP:
case DLT_IP_OVER_FC:
return gen_llc(proto);
break;
@ -2234,6 +2252,42 @@ gen_wlanhostop(eaddr, dir)
/* NOTREACHED */
}
/*
* Like gen_ehostop, but for RFC 2625 IP-over-Fibre-Channel.
* (We assume that the addresses are IEEE 48-bit MAC addresses,
* as the RFC states.)
*/
static struct block *
gen_ipfchostop(eaddr, dir)
register const u_char *eaddr;
register int dir;
{
register struct block *b0, *b1;
switch (dir) {
case Q_SRC:
return gen_bcmp(10, 6, eaddr);
case Q_DST:
return gen_bcmp(2, 6, eaddr);
case Q_AND:
b0 = gen_ipfchostop(eaddr, Q_SRC);
b1 = gen_ipfchostop(eaddr, Q_DST);
gen_and(b0, b1);
return b1;
case Q_DEFAULT:
case Q_OR:
b0 = gen_ipfchostop(eaddr, Q_SRC);
b1 = gen_ipfchostop(eaddr, Q_DST);
gen_or(b0, b1);
return b1;
}
abort();
/* NOTREACHED */
}
/*
* This is quite tricky because there may be pad bytes in front of the
* DECNET header, and then there are two possible data packet formats that
@ -2592,9 +2646,11 @@ gen_gateway(eaddr, alist, proto, dir)
*/
b0 = gen_ehostop(eaddr, Q_OR);
gen_and(b1, b0);
} else
} else if (linktype == DLT_IP_OVER_FC)
b0 = gen_ipfchostop(eaddr, Q_OR);
else
bpf_error(
"'gateway' supported only on ethernet/FDDI/token ring/802.11");
"'gateway' supported only on ethernet/FDDI/token ring/802.11/Fibre Channel");
b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR);
while (*alist) {
@ -3581,6 +3637,15 @@ gen_scode(name, q)
free(eaddr);
return b;
case DLT_IP_OVER_FC:
eaddr = pcap_ether_hostton(name);
if (eaddr == NULL)
bpf_error(
"unknown Fibre Channel host '%s'", name);
b = gen_ipfchostop(eaddr, dir);
free(eaddr);
return b;
case DLT_SUNATM:
if (!is_lane)
break;
@ -3604,7 +3669,7 @@ gen_scode(name, q)
return b;
}
bpf_error("only ethernet/FDDI/token ring/802.11/ATM LANE supports link-level host name");
bpf_error("only ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel supports link-level host name");
} else if (proto == Q_DECNET) {
unsigned short dn_addr = __pcap_nametodnaddr(name);
/*
@ -3981,7 +4046,9 @@ gen_ecode(eaddr, q)
gen_and(tmp, b);
return b;
}
bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE");
if (linktype == DLT_IP_OVER_FC)
return gen_ipfchostop(eaddr, (int)q.dir);
bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
}
bpf_error("ethernet address used in non-ether expression");
/* NOTREACHED */

View File

@ -26,7 +26,7 @@
*/
#ifndef lint
static const char rcsid[] =
"@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.84 2002-07-12 07:51:15 guy Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.85 2002-10-18 08:46:14 guy Exp $ (LBL)";
#endif
/*
@ -1096,6 +1096,30 @@ static void map_arphrd_to_dlt(pcap_t *handle, int arptype, int cooked_ok)
handle->linktype = DLT_LTALK;
break;
#ifndef ARPHRD_FCPP
#define ARPHRD_FCPP 784
#endif
case ARPHRD_FCPP:
#ifndef ARPHRD_FCAL
#define ARPHRD_FCAL 785
#endif
case ARPHRD_FCAL:
#ifndef ARPHRD_FCPL
#define ARPHRD_FCPL 786
#endif
case ARPHRD_FCPL:
#ifndef ARPHRD_FCFABRIC
#define ARPHRD_FCFABRIC 787
#endif
case ARPHRD_FCFABRIC:
/*
* We assume that those all mean RFC 2625 IP-over-
* Fibre Channel, with the RFC 2625 header at
* the beginning of the packet.
*/
handle->linktype = DLT_IP_OVER_FC;
break;
default:
handle->linktype = -1;
break;

6
pcap.3
View File

@ -1,4 +1,4 @@
.\" @(#) $Header: /tcpdump/master/libpcap/Attic/pcap.3,v 1.38 2002-09-18 19:07:57 guy Exp $
.\" @(#) $Header: /tcpdump/master/libpcap/Attic/pcap.3,v 1.39 2002-10-18 08:46:15 guy Exp $
.\"
.\" Copyright (c) 1994, 1996, 1997
.\" The Regents of the University of California. All rights reserved.
@ -752,6 +752,10 @@ a 1-byte VPI value;
.LP
a 2-byte VCI field, in network byte order.
.RE
.TP 5
.B DLT_IP_OVER_FC
RFC 2625 IP-over-Fibre Channel, with the link-layer header being the
Network_Header as described in that RFC.
.PP
.B pcap_snapshot()
returns the snapshot length specified when

View File

@ -30,7 +30,7 @@
#ifndef lint
static const char rcsid[] =
"@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.67 2002-10-09 19:02:56 guy Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.68 2002-10-18 08:46:15 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@ -164,6 +164,7 @@ static const char rcsid[] =
#define LINKTYPE_CISCO_IOS 118 /* For Cisco-internal use */
#define LINKTYPE_PRISM_HEADER 119 /* 802.11+Prism II monitor mode */
#define LINKTYPE_AIRONET_HEADER 120 /* FreeBSD Aironet driver stuff */
#define LINKTYPE_IP_OVER_FC 122 /* RFC 2625 IP-over-Fibre Channel */
#define LINKTYPE_SUNATM 123 /* Solaris+SunATM */
/*
@ -176,7 +177,6 @@ static const char rcsid[] =
#define LINKTYPE_IPFILTER 116 /* IP Filter capture files */
#define LINKTYPE_PFLOG 117 /* OpenBSD DLT_PFLOG */
#define LINKTYPE_HHDLC 121 /* Siemens HiPath HDLC */
#define LINKTYPE_IP_OVER_FC 122 /* RFC 2625 IP-over-Fibre Channel */
#define LINKTYPE_RIO 123 /* RapidIO */
#define LINKTYPE_PCI_EXP 124 /* PCI Express */
#define LINKTYPE_AURORA 125 /* Xilinx Aurora link layer */