aboutsummaryrefslogtreecommitdiffstats
path: root/packet-ipv6.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2000-04-20 07:05:58 +0000
committerGuy Harris <guy@alum.mit.edu>2000-04-20 07:05:58 +0000
commitedd1f261709079cbe0ebe7f9bb8b447a250271c5 (patch)
treec53d7501daab4f29fddb7a458d040b7799b4eea9 /packet-ipv6.c
parentc2a68f6b86c75772f44e15b5d926ea25966e9241 (diff)
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
Diffstat (limited to 'packet-ipv6.c')
-rw-r--r--packet-ipv6.c93
1 files changed, 29 insertions, 64 deletions
diff --git a/packet-ipv6.c b/packet-ipv6.c
index 35226668ac..267a7ae543 100644
--- a/packet-ipv6.c
+++ b/packet-ipv6.c
@@ -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);
+ 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;
+ 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);
}