Have the IPv6 dissector use the same dissector table as the IPv4

dissector.

Don't dissect the payload of any fragmented IPv6 packet unless it's the
initial fragment (that's what we do for IPv4).

svn path=/trunk/; revision=1882
This commit is contained in:
Guy Harris 2000-04-20 07:05:58 +00:00
parent c2a68f6b86
commit edd1f26170
14 changed files with 73 additions and 175 deletions

View File

@ -1,7 +1,7 @@
# Makefile.am
# Automake file for Ethereal
#
# $Id: Makefile.am,v 1.190 2000/04/20 02:17:54 guy Exp $
# $Id: Makefile.am,v 1.191 2000/04/20 07:05:52 guy Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@zing.org>
@ -82,7 +82,6 @@ DISSECTOR_SOURCES = \
packet-http.c \
packet-http.h \
packet-icmpv6.c\
packet-icmpv6.h\
packet-icp.c \
packet-icq.c \
packet-imap.c \
@ -148,7 +147,6 @@ DISSECTOR_SOURCES = \
packet-ospf.c \
packet-ospf.h \
packet-pim.c \
packet-pim.h \
packet-pop.c \
packet-portmap.c \
packet-portmap.h \

View File

@ -1,7 +1,7 @@
/* packet-icmpv6.c
* Routines for ICMPv6 packet disassembly
*
* $Id: packet-icmpv6.c,v 1.14 2000/03/12 04:47:38 gram Exp $
* $Id: packet-icmpv6.c,v 1.15 2000/04/20 07:05:53 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -56,6 +56,7 @@
#include <glib.h>
#include "packet.h"
#include "packet-ipv6.h"
#include "packet-ip.h"
#include "resolv.h"
#ifndef offsetof
@ -198,7 +199,7 @@ again:
goto again;
}
void
static void
dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{
proto_tree *icmp6_tree, *field_tree;
@ -600,3 +601,10 @@ proto_register_icmpv6(void)
proto_register_field_array(proto_icmpv6, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}
void
proto_reg_handoff_icmpv6(void)
{
dissector_add("ip.proto", IP_PROTO_ICMPV6, dissect_icmpv6);
}

View File

@ -1,26 +0,0 @@
/* packet-icmpv6.h
*
* $Id: packet-icmpv6.h,v 1.1 2000/02/15 21:02:14 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
void dissect_icmpv6(const u_char *, int, frame_data *, proto_tree *);

View File

@ -1,7 +1,7 @@
/* packet-ip.c
* Routines for IP and miscellaneous IP protocol packet disassembly
*
* $Id: packet-ip.c,v 1.82 2000/04/17 00:32:38 guy Exp $
* $Id: packet-ip.c,v 1.83 2000/04/20 07:05:54 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -98,7 +98,8 @@ static gint ett_ip_option_sec = -1;
static gint ett_ip_option_route = -1;
static gint ett_ip_option_timestamp = -1;
static dissector_table_t ip_dissector_table;
/* Used by IPv6 as well, so not static */
dissector_table_t ip_dissector_table;
static int proto_igmp = -1;
static int hf_igmp_version = -1;
@ -862,28 +863,6 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
/* XXX - check to make sure this is at least IPH_MIN_LEN. */
hlen = lo_nibble(iph.ip_v_hl) * 4; /* IP header length, in bytes */
switch (iph.ip_p) {
case IP_PROTO_ICMP:
case IP_PROTO_IGMP:
case IP_PROTO_TCP:
case IP_PROTO_UDP:
case IP_PROTO_OSPF:
case IP_PROTO_GRE:
case IP_PROTO_ESP:
case IP_PROTO_AH:
case IP_PROTO_IPV6:
case IP_PROTO_PIM:
case IP_PROTO_VINES:
/* Names are set in the associated dissect_* routines */
break;
default:
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "IP");
if (check_col(fd, COL_INFO))
col_add_fstr(fd, COL_INFO, "%s (0x%02x)",
ipprotostr(iph.ip_p), iph.ip_p);
}
if (tree) {
switch (IPTOS_TOS(iph.ip_tos)) {
@ -995,20 +974,22 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
}
again:
/* do lookup with the subdissector table */
if (dissector_try_port(ip_dissector_table, nxt, pd, offset, fd, tree))
return;
switch (nxt) {
case IP_PROTO_AH:
advance = dissect_ah(pd, offset, fd, tree);
nxt = pd[offset];
offset += advance;
goto again;
default:
dissect_data(pd, offset, fd, tree);
break;
}
/* do lookup with the subdissector table */
if (!dissector_try_port(ip_dissector_table, nxt, pd, offset, fd, tree)) {
/* Unknown protocol */
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "IP");
if (check_col(fd, COL_INFO))
col_add_fstr(fd, COL_INFO, "%s (0x%02x)", ipprotostr(iph.ip_p), iph.ip_p);
dissect_data(pd, offset, fd, tree);
}
}
@ -1486,8 +1467,9 @@ proto_reg_handoff_ip(void)
{
dissector_add("ethertype", ETHERTYPE_IP, dissect_ip);
dissector_add("ppp.protocol", PPP_IP, dissect_ip);
dissector_add("ip.proto", IP_PROTO_IPV4, dissect_ip);
dissector_add("llc.dsap", SAP_IP, dissect_ip);
dissector_add("ip.proto", IP_PROTO_IPV4, dissect_ip);
dissector_add("ip.proto", IP_PROTO_IPIP, dissect_ip);
}
void

View File

@ -1,7 +1,7 @@
/* packet-ip.h
* Definitions for IP packet disassembly structures and routines
*
* $Id: packet-ip.h,v 1.11 2000/02/15 21:02:18 gram Exp $
* $Id: packet-ip.h,v 1.12 2000/04/20 07:05:54 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -83,4 +83,7 @@ typedef struct ip_tcp_opt {
void dissect_ip_tcp_options(const u_char *, int, guint,
const ip_tcp_opt *, int, int, proto_tree *);
/* Dissector table for "ip.proto"; used by IPv6 as well as IPv4 */
dissector_table_t ip_dissector_table;
#endif

View File

@ -1,7 +1,7 @@
/* packet-ipsec.c
* Routines for IPsec/IPComp packet disassembly
*
* $Id: packet-ipsec.c,v 1.13 2000/04/16 22:46:20 guy Exp $
* $Id: packet-ipsec.c,v 1.14 2000/04/20 07:05:55 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -141,7 +141,7 @@ dissect_ah(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
return advance;
}
void
static void
dissect_esp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{
proto_tree *esp_tree;
@ -178,7 +178,7 @@ dissect_esp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
}
}
void
static void
dissect_ipcomp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{
proto_tree *ipcomp_tree;

View File

@ -1,6 +1,6 @@
/* packet-ipsec.h
*
* $Id: packet-ipsec.h,v 1.1 2000/02/15 21:02:20 gram Exp $
* $Id: packet-ipsec.h,v 1.2 2000/04/20 07:05:55 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -24,5 +24,3 @@
int dissect_ah(const u_char *, int, frame_data *, proto_tree *);
void dissect_esp(const u_char *, int, frame_data *, proto_tree *);
void dissect_ipcomp(const u_char *, int, frame_data *, proto_tree *);

View File

@ -1,7 +1,7 @@
/* packet-ipv6.c
* Routines for IPv6 packet disassembly
*
* $Id: packet-ipv6.c,v 1.34 2000/04/16 22:46:20 guy Exp $
* $Id: packet-ipv6.c,v 1.35 2000/04/20 07:05:56 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -45,11 +45,9 @@
#include "etypes.h"
#include "ppptypes.h"
#include "packet.h"
#include "packet-icmpv6.h"
#include "packet-ip.h"
#include "packet-ipsec.h"
#include "packet-ipv6.h"
#include "packet-pim.h"
#include "packet-tcp.h"
#include "packet-udp.h"
#include "resolv.h"
@ -268,9 +266,6 @@ dissect_ipv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
SET_ADDRESS(&pi.net_dst, AT_IPv6, 16, &pd[offset + IP6H_DST]);
SET_ADDRESS(&pi.dst, AT_IPv6, 16, &pd[offset + IP6H_DST]);
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "IPv6");
if (tree) {
/* !!! specify length */
ti = proto_tree_add_item(tree, proto_ipv6, offset, 40, NULL);
@ -345,9 +340,6 @@ again:
nxt = pd[poffset = offset];
offset += advance;
goto again;
case IP_PROTO_IPIP:
dissect_ip(pd, offset, fd, tree);
break;
case IP_PROTO_ROUTING:
advance = dissect_routing6(pd, offset, fd, tree);
nxt = pd[poffset = offset];
@ -358,74 +350,46 @@ again:
nxt = pd[poffset = offset];
offset += advance;
goto again;
case IP_PROTO_ICMPV6:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (!frag)
dissect_icmpv6(pd, offset, fd, tree);
else
dissect_data(pd, offset, fd, tree);
break;
case IP_PROTO_NONE:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (check_col(fd, COL_INFO)) {
col_add_fstr(fd, COL_INFO, "IPv6 no next header");
}
break;
case IP_PROTO_AH:
advance = dissect_ah(pd, offset, fd, tree);
nxt = pd[poffset = offset];
offset += advance;
goto again;
case IP_PROTO_ESP:
dissect_esp(pd, offset, fd, tree);
break;
case IP_PROTO_DSTOPTS:
advance = dissect_dstopts(pd, offset, fd, tree);
nxt = pd[poffset = offset];
offset += advance;
goto again;
case IP_PROTO_TCP:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (!frag)
dissect_tcp(pd, offset, fd, tree);
else
dissect_data(pd, offset, fd, tree);
break;
case IP_PROTO_UDP:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (!frag)
dissect_udp(pd, offset, fd, tree);
else
dissect_data(pd, offset, fd, tree);
break;
case IP_PROTO_PIM:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
dissect_pim(pd, offset, fd, tree);
break;
case IP_PROTO_IPCOMP:
dissect_ipcomp(pd, offset, fd, tree);
break;
default:
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (check_col(fd, COL_INFO)) {
col_add_fstr(fd, COL_INFO, "%s (0x%02x)",
ipprotostr(nxt), nxt);
}
dissect_data(pd, offset, fd, tree);
break;
}
#ifdef TEST_FINALHDR
proto_tree_add_item_hidden(ipv6_tree, hf_ipv6_final, poffset, 1, nxt);
#endif
if (frag) {
/* fragmented */
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "IPv6");
/* COL_INFO was filled in by "dissect_frag6()" */
dissect_data(pd, offset, fd, tree);
} else {
/* do lookup with the subdissector table */
if (!dissector_try_port(ip_dissector_table, nxt, pd, offset, fd, tree)) {
/* Unknown protocol */
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "IPv6");
if (check_col(fd, COL_INFO))
col_add_fstr(fd, COL_INFO, "%s (0x%02x)", ipprotostr(nxt), nxt);
dissect_data(pd, offset, fd, tree);
}
}
}
static void
dissect_ipv6_none(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
if (check_col(fd, COL_INFO))
col_add_fstr(fd, COL_INFO, "IPv6 no next header");
/* XXX - dissect the payload as padding? */
}
void
@ -479,4 +443,5 @@ proto_reg_handoff_ipv6(void)
dissector_add("ethertype", ETHERTYPE_IPv6, dissect_ipv6);
dissector_add("ppp.protocol", PPP_IPV6, dissect_ipv6);
dissector_add("ip.proto", IP_PROTO_IPV6, dissect_ipv6);
dissector_add("ip.proto", IP_PROTO_NONE, dissect_ipv6_none);
}

View File

@ -2,7 +2,7 @@
* Routines for PIM disassembly
* (c) Copyright Jun-ichiro itojun Hagino <itojun@itojun.org>
*
* $Id: packet-pim.c,v 1.11 2000/04/16 22:46:22 guy Exp $
* $Id: packet-pim.c,v 1.12 2000/04/20 07:05:56 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -162,7 +162,7 @@ dissect_pim_addr(const u_char *bp, const u_char *ep, enum pimv2_addrtype at,
return buf;
}
void
static void
dissect_pim(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
struct pim pim;
static const value_string type1vals[] = {

View File

@ -1,26 +0,0 @@
/* packet-pim.h
*
* $Id: packet-pim.h,v 1.1 2000/02/15 21:02:50 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
void dissect_pim(const u_char *, int, frame_data *, proto_tree *);

View File

@ -1,7 +1,7 @@
/* packet-tcp.c
* Routines for TCP packet disassembly
*
* $Id: packet-tcp.c,v 1.71 2000/04/17 02:39:54 guy Exp $
* $Id: packet-tcp.c,v 1.72 2000/04/20 07:05:57 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -423,7 +423,7 @@ decode_tcp_ports( const u_char *pd, int offset, frame_data *fd, proto_tree *tree
}
void
static void
dissect_tcp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
e_tcphdr th;
proto_tree *tcp_tree = NULL, *field_tree = NULL;

View File

@ -1,6 +1,6 @@
/* packet-tcp.h
*
* $Id: packet-tcp.h,v 1.3 2000/04/12 22:53:15 guy Exp $
* $Id: packet-tcp.h,v 1.4 2000/04/20 07:05:57 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -27,5 +27,3 @@ extern guint16 tcp_urgent_pointer;
extern void decode_tcp_ports(const u_char *, int, frame_data *,
proto_tree *, int, int);
void dissect_tcp(const u_char *, int, frame_data *, proto_tree *);

View File

@ -1,7 +1,7 @@
/* packet-udp.c
* Routines for UDP packet disassembly
*
* $Id: packet-udp.c,v 1.68 2000/04/18 04:46:07 guy Exp $
* $Id: packet-udp.c,v 1.69 2000/04/20 07:05:57 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -140,7 +140,7 @@ decode_udp_ports( const u_char *pd, int offset, frame_data *fd,
}
void
static void
dissect_udp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
e_udphdr uh;
guint16 uh_sport, uh_dport, uh_ulen, uh_sum;

View File

@ -1,6 +1,6 @@
/* packet-udp.h
*
* $Id: packet-udp.h,v 1.2 2000/04/12 22:53:16 guy Exp $
* $Id: packet-udp.h,v 1.3 2000/04/20 07:05:58 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -24,5 +24,3 @@
extern void decode_udp_ports(const u_char *, int, frame_data *,
proto_tree *, int, int);
void dissect_udp(const u_char *, int, frame_data *, proto_tree *);