diff options
author | Guy Harris <guy@alum.mit.edu> | 2000-04-20 07:05:58 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2000-04-20 07:05:58 +0000 |
commit | edd1f261709079cbe0ebe7f9bb8b447a250271c5 (patch) | |
tree | c53d7501daab4f29fddb7a458d040b7799b4eea9 /packet-ipv6.c | |
parent | c2a68f6b86c75772f44e15b5d926ea25966e9241 (diff) | |
download | wireshark-edd1f261709079cbe0ebe7f9bb8b447a250271c5.tar.gz wireshark-edd1f261709079cbe0ebe7f9bb8b447a250271c5.tar.bz2 wireshark-edd1f261709079cbe0ebe7f9bb8b447a250271c5.zip |
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.c | 93 |
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); } |