diff options
-rw-r--r-- | AUTHORS | 5 | ||||
-rw-r--r-- | Makefile.am | 4 | ||||
-rw-r--r-- | doc/ethereal.pod.template | 1 | ||||
-rw-r--r-- | ipproto.h | 5 | ||||
-rw-r--r-- | packet-enc.c | 205 | ||||
-rw-r--r-- | packet-etherip.c | 124 | ||||
-rw-r--r-- | wiretap/libpcap.c | 4 | ||||
-rw-r--r-- | wiretap/wtap.h | 5 |
8 files changed, 346 insertions, 7 deletions
@@ -1640,6 +1640,11 @@ Miha Jemec <m.jemec [AT] iskratel.si> { Support for G.711 codec } +Markus Friedl <markus [AT] openbsd.org> { + Support for OpenBSD Encapsulating Device + Support for Ethernet-within-IP encapsulation +} + And assorted fixes and enhancements by the people listed above and by: Pavel Roskin <proski [AT] gnu.org> diff --git a/Makefile.am b/Makefile.am index 6d8f36dad3..73bb5534b6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ # Makefile.am # Automake file for Ethereal # -# $Id: Makefile.am,v 1.566 2003/03/06 20:35:09 sahlberg Exp $ +# $Id: Makefile.am,v 1.567 2003/03/07 16:52:41 gerald Exp $ # # Ethereal - Network traffic analyzer # By Gerald Combs <gerald@ethereal.com> @@ -179,8 +179,10 @@ DISSECTOR_SRC = \ packet-eap.c \ packet-eapol.c \ packet-eigrp.c \ + packet-enc.c \ packet-esis.c \ packet-eth.c \ + packet-etherip.c \ packet-ethertype.c \ packet-fc.c \ packet-fcct.c \ diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template index 9935fd9f35..ba17946947 100644 --- a/doc/ethereal.pod.template +++ b/doc/ethereal.pod.template @@ -1731,6 +1731,7 @@ B<http://www.ethereal.com>. Pavel Roskin <proski [AT] gnu.org> Georgi Guninski <guninski [AT] guninski.com> Jason Copenhaver <jcopenha [AT] typedef.org> + Markus Friedl <markus [AT] openbsd.org> Alain Magloire <alainm[AT]rcsm.ece.mcgill.ca> was kind enough to give his permission to use his version of snprintf.c. @@ -2,7 +2,7 @@ * Declarations of IP protocol numbers, and of routines for converting * IP protocol numbers into strings. * - * $Id: ipproto.h,v 1.7 2003/02/04 20:16:57 guy Exp $ + * $Id: ipproto.h,v 1.8 2003/03/07 16:52:41 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -53,11 +53,12 @@ #define IP_PROTO_ICMPV6 58 /* ICMP6 */ #define IP_PROTO_NONE 59 /* IP6 no next header */ #define IP_PROTO_DSTOPTS 60 /* IP6 destination options */ -#define IP_PROTO_MIPV6 62 /* Mobile IPv6 */ +#define IP_PROTO_MIPV6 62 /* Mobile IPv6 */ #define IP_PROTO_EON 80 /* ISO cnlp */ #define IP_PROTO_VINES 83 /* Vines over raw IP */ #define IP_PROTO_EIGRP 88 #define IP_PROTO_OSPF 89 +#define IP_PROTO_ETHERIP 97 /* Ethernet-within-IP (RFC 3378) */ #define IP_PROTO_ENCAP 98 /* encapsulation header */ #define IP_PROTO_PIM 103 /* Protocol Independent Mcast */ #define IP_PROTO_IPCOMP 108 /* IP payload compression */ diff --git a/packet-enc.c b/packet-enc.c new file mode 100644 index 0000000000..0b1a93e7e9 --- /dev/null +++ b/packet-enc.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2003 Markus Friedl. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <string.h> +#include <glib.h> +#include <epan/packet.h> +#include "etypes.h" +#include <epan/resolv.h> +#include "packet-ip.h" +#include "packet-ipv6.h" + +#ifndef offsetof +/* Can't trust stddef.h to be there for us */ +# define offsetof(type, member) ((size_t)(&((type *)0)->member)) +#endif + +/* The header in OpenBSD Encapsulating Interface files. */ + +struct enchdr { + guint32 af; + guint32 spi; + guint32 flags; +}; +#define ENC_HDRLEN sizeof(struct enchdr) + +# define BSD_ENC_INET 2 +# define BSD_ENC_INET6 24 + +# define BSD_ENC_M_CONF 0x0400 /* payload encrypted */ +# define BSD_ENC_M_AUTH 0x0800 /* payload authenticated */ +# define BSD_ENC_M_COMP 0x1000 /* payload compressed */ +# define BSD_ENC_M_AUTH_AH 0x2000 /* header authenticated */ + + +static dissector_handle_t data_handle, ip_handle, ipv6_handle; + +/* header fields */ +static unsigned int proto_enc = -1; +static unsigned int hf_enc_af = -1; +static unsigned int hf_enc_spi = -1; +static unsigned int hf_enc_flags = -1; + +static gint ett_enc = -1; + +void +capture_enc(const guchar *pd, int offset, int len, packet_counts *ld) +{ + struct enchdr ench; + + if (!BYTES_ARE_IN_FRAME(offset, len, (int)ENC_HDRLEN)) { + ld->other++; + return; + } + + offset += ENC_HDRLEN; + + /* Copy out the enc header to insure alignment */ + memcpy(&ench, pd, sizeof(ench)); + ench.af = g_ntohl(ench.af); + + switch (ench.af) { + + case BSD_ENC_INET: + capture_ip(pd, offset, len, ld); + break; + +#ifdef notyet + case BSD_ENC_INET6: + capture_ipv6(pd, offset, len, ld); + break; +#endif + + default: + ld->other++; + break; + } +} + +static const value_string af_vals[] = { + { BSD_ENC_INET, "IPv4" }, + { BSD_ENC_INET6, "IPv6" }, + { 0, NULL } +}; + +static void +dissect_enc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + struct enchdr ench; + tvbuff_t *next_tvb; + proto_tree *enc_tree; + proto_item *ti; + + if (check_col(pinfo->cinfo, COL_PROTOCOL)) + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ENC"); + + /* Copy out the enc header to insure alignment */ + tvb_memcpy(tvb, (guint8 *)&ench, 0, sizeof(ench)); + + /* Byteswap the header now */ + ench.spi = g_ntohl(ench.spi); + /* ench.af = g_ntohl(ench.af); */ + /* ench.flags = g_ntohl(ench.flags); */ + + if (tree) { + ti = proto_tree_add_protocol_format(tree, proto_enc, tvb, 0, + ENC_HDRLEN, + "Enc %s, SPI 0x%8.8x, %s%s%s%s", + val_to_str(ench.af, af_vals, "unknown (%u)"), + ench.spi, + ench.flags ? "" : "unprotected", + ench.flags & BSD_ENC_M_AUTH ? "authentic" : "", + (ench.flags & (BSD_ENC_M_AUTH|BSD_ENC_M_CONF)) == + (BSD_ENC_M_AUTH|BSD_ENC_M_CONF) ? ", " : "", + ench.flags & BSD_ENC_M_CONF ? "confidential" : "" + ); + enc_tree = proto_item_add_subtree(ti, ett_enc); + + proto_tree_add_uint(enc_tree, hf_enc_af, tvb, + offsetof(struct enchdr, af), sizeof(ench.af), + ench.af); + proto_tree_add_uint(enc_tree, hf_enc_spi, tvb, + offsetof(struct enchdr, spi), sizeof(ench.spi), + ench.spi); + proto_tree_add_uint(enc_tree, hf_enc_flags, tvb, + offsetof(struct enchdr, flags), sizeof(ench.flags), + ench.flags); + } + + /* Set the tvbuff for the payload after the header */ + next_tvb = tvb_new_subset(tvb, ENC_HDRLEN, -1, -1); + + switch (ench.af) { + + case BSD_ENC_INET: + call_dissector(ip_handle, next_tvb, pinfo, tree); + break; + + case BSD_ENC_INET6: + call_dissector(ipv6_handle, next_tvb, pinfo, tree); + break; + + default: + call_dissector(data_handle, next_tvb, pinfo, tree); + break; + } +} + +void +proto_register_enc(void) +{ + static hf_register_info hf[] = { + { &hf_enc_af, + { "Address Family", "enc.af", FT_UINT32, BASE_DEC, VALS(af_vals), 0x0, + "Protocol (IPv4 vs IPv6)", HFILL }}, + { &hf_enc_spi, + { "SPI", "enc.spi", FT_UINT32, BASE_HEX, NULL, 0x0, + "Security Parameter Index", HFILL }}, + { &hf_enc_flags, + { "Flags", "enc.flags", FT_UINT32, BASE_HEX, NULL, 0x0, + "ENC flags", HFILL }}, + }; + static gint *ett[] = { &ett_enc }; + + proto_enc = proto_register_protocol("OpenBSD Encapsulating device", + "ENC", "enc"); + proto_register_field_array(proto_enc, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); +} + +void +proto_reg_handoff_enc(void) +{ + dissector_handle_t enc_handle; + + ip_handle = find_dissector("ip"); + ipv6_handle = find_dissector("ipv6"); + data_handle = find_dissector("data"); + + enc_handle = create_dissector_handle(dissect_enc, proto_enc); + dissector_add("wtap_encap", WTAP_ENCAP_ENC0, enc_handle); +} diff --git a/packet-etherip.c b/packet-etherip.c new file mode 100644 index 0000000000..be958ce317 --- /dev/null +++ b/packet-etherip.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003 Markus Friedl. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <string.h> +#include <glib.h> +#include <epan/packet.h> +#include "ipproto.h" + +static int proto_etherip = -1; +static int hf_etherip_ver = -1; + +static gint ett_etherip = -1; + +static dissector_handle_t eth_handle; + +#ifndef offsetof +#define offsetof(type, member) ((size_t)(&((type *)0)->member)) +#endif + + +/* + * RFC 3378: EtherIP: Tunneling Ethernet Frames in IP Datagrams + * + * Bits 0-3: Protocol version + * Bits 4-15: Reserved for future use + */ + +struct etheriphdr { + guint8 ver; /* version/reserved */ + guint8 pad; /* required padding byte */ +}; + +#define ETHERIP_VERS_MASK 0x0f + + +static void +dissect_etherip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + struct etheriphdr etheriph; + tvbuff_t *next_tvb; + proto_tree *etherip_tree; + proto_item *ti; + + if (check_col(pinfo->cinfo, COL_PROTOCOL)) + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ETHERIP"); + + /* Copy out the etherip header to insure alignment */ + tvb_memcpy(tvb, (guint8 *)ðeriph, 0, sizeof(etheriph)); + + /* mask out reserved bits */ + etheriph.ver &= ETHERIP_VERS_MASK; + + if (tree) { + ti = proto_tree_add_protocol_format(tree, proto_etherip, tvb, 0, + sizeof(etheriph), + "EtherIP, Version %d", + etheriph.ver + ); + etherip_tree = proto_item_add_subtree(ti, ett_etherip); + + proto_tree_add_uint(etherip_tree, hf_etherip_ver, tvb, + offsetof(struct etheriphdr, ver), sizeof(etheriph.ver), + etheriph.ver); + } + + /* Set the tvbuff for the payload after the header */ + next_tvb = tvb_new_subset(tvb, sizeof(etheriph), -1, -1); + + call_dissector(eth_handle, next_tvb, pinfo, tree); +} + +void +proto_register_etherip(void) +{ + static hf_register_info hf_etherip[] = { + { &hf_etherip_ver, + { "Version", "etherip.ver", FT_UINT8, BASE_HEX, NULL, 0x0, + "", HFILL }}, + }; + static gint *ett[] = { + &ett_etherip, + }; + + proto_etherip = proto_register_protocol("Ethernet over IP", + "ETHERIP", "etherip"); + proto_register_field_array(proto_etherip, hf_etherip, array_length(hf_etherip)); + proto_register_subtree_array(ett, array_length(ett)); + + register_dissector("etherip", dissect_etherip, proto_etherip); +} + +void +proto_reg_handoff_etherip(void) +{ + dissector_handle_t etherip_handle; + + eth_handle = find_dissector("eth"); + etherip_handle = find_dissector("etherip"); + dissector_add("ip.proto", IP_PROTO_ETHERIP, etherip_handle); +} diff --git a/wiretap/libpcap.c b/wiretap/libpcap.c index b7d633817a..aae2e6f428 100644 --- a/wiretap/libpcap.c +++ b/wiretap/libpcap.c @@ -1,6 +1,6 @@ /* libpcap.c * - * $Id: libpcap.c,v 1.92 2003/01/31 01:02:07 guy Exp $ + * $Id: libpcap.c,v 1.93 2003/03/07 16:52:46 gerald Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu> @@ -324,7 +324,7 @@ static const struct { #if defined(DLT_ATM_RFC1483) && (DLT_ATM_RFC1483 == 13) { 13, WTAP_ENCAP_ATM_RFC1483 }, #elif defined(DLT_ENC) && (DLT_ENC == 13) - /* Put entry for DLT_ENC here */ + { 13, WTAP_ENCAP_ENC0 }, #endif /* diff --git a/wiretap/wtap.h b/wiretap/wtap.h index 0c3b1c1075..09f153e32f 100644 --- a/wiretap/wtap.h +++ b/wiretap/wtap.h @@ -1,6 +1,6 @@ /* wtap.h * - * $Id: wtap.h,v 1.134 2003/01/31 01:02:14 guy Exp $ + * $Id: wtap.h,v 1.135 2003/03/07 16:52:46 gerald Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu> @@ -126,9 +126,10 @@ #define WTAP_ENCAP_WFLEET_HDLC 34 #define WTAP_ENCAP_SDLC 35 #define WTAP_ENCAP_TZSP 36 +#define WTAP_ENCAP_ENC0 37 /* last WTAP_ENCAP_ value + 1 */ -#define WTAP_NUM_ENCAP_TYPES 37 +#define WTAP_NUM_ENCAP_TYPES 38 /* File types that can be read by wiretap. We support writing some many of these file types, too, so we |