diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2016-07-29 14:54:06 +0100 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2016-07-29 16:41:06 +0000 |
commit | 3da56e4771b4d6b74185d44e44b6869864ae2418 (patch) | |
tree | f2f50f09751b79f2a62c552372e9ac9045c99fbb /epan/dissectors/packet-ipv6.c | |
parent | b6d13ef90de224d230300493b38d02b97cf63cde (diff) |
IPv6: Dissect unknown routing header types as data
Change-Id: I1fa840d24d56643515c6fc8d73967307bf1951d6
Reviewed-on: https://code.wireshark.org/review/16762
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'epan/dissectors/packet-ipv6.c')
-rw-r--r-- | epan/dissectors/packet-ipv6.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c index 3f0b041ad3..da1fde87ed 100644 --- a/epan/dissectors/packet-ipv6.c +++ b/epan/dissectors/packet-ipv6.c @@ -212,6 +212,7 @@ static int hf_ipv6_routing_len = -1; static int hf_ipv6_routing_len_oct = -1; static int hf_ipv6_routing_type = -1; static int hf_ipv6_routing_segleft = -1; +static int hf_ipv6_routing_unknown_data = -1; static int hf_ipv6_fraghdr_nxt = -1; static int hf_ipv6_fraghdr_reserved_octet = -1; static int hf_ipv6_fraghdr_offset = -1; @@ -301,7 +302,7 @@ static gint ett_geoip_info = -1; static expert_field ei_ipv6_routing_invalid_length = EI_INIT; static expert_field ei_ipv6_routing_invalid_segleft = EI_INIT; -static expert_field ei_ipv6_routing_not_implemented = EI_INIT; +static expert_field ei_ipv6_routing_undecoded = EI_INIT; static expert_field ei_ipv6_dst_addr_not_multicast = EI_INIT; static expert_field ei_ipv6_src_route_list_mult_inst_same_addr = EI_INIT; static expert_field ei_ipv6_src_route_list_src_addr = EI_INIT; @@ -1054,7 +1055,7 @@ dissect_routing6_srh(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree * /* TODO: dissect TLVs */ ti = proto_tree_add_bitmask(rthdr_tree, tvb, offset, hf_ipv6_routing_srh_flags, ett_ipv6_routing_srh_flags, srh_flags, ENC_BIG_ENDIAN); - expert_add_info_format(pinfo, ti, &ei_ipv6_routing_not_implemented, + expert_add_info_format(pinfo, ti, &ei_ipv6_routing_undecoded, "Dissection for SRH TLVs not yet implemented"); offset += 2; @@ -1111,6 +1112,20 @@ dissect_routing6_srh(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree * } } +/* Unknown Routing Header Type */ +/* RFC 2460 */ +static void +dissect_routing6_unknown(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *rthdr_tree, + struct rthdr_proto_item *rthdr_ti _U_, struct ip6_rthdr rt) +{ + gint len; + proto_item *ti; + + len = ((rt.ip6r_len + 1) << 3) - 4; + ti = proto_tree_add_item(rthdr_tree, hf_ipv6_routing_unknown_data, tvb, offset, len, ENC_NA); + expert_add_info(pinfo, ti, &ei_ipv6_routing_undecoded); +} + static int dissect_routing6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { struct ip6_rthdr rt; @@ -1165,6 +1180,9 @@ dissect_routing6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data case IPv6_RT_HEADER_SOURCE_ROUTING: dissect_routing6_rt0(tvb, offset, pinfo, rthdr_tree, &rthdr_ti, rt); break; + case IPv6_RT_HEADER_NIMROD: + dissect_routing6_unknown(tvb, offset, pinfo, rthdr_tree, &rthdr_ti, rt); + break; case IPv6_RT_HEADER_MobileIP: dissect_routing6_mipv6(tvb, offset, pinfo, rthdr_tree, &rthdr_ti, rt); break; @@ -1175,6 +1193,7 @@ dissect_routing6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data dissect_routing6_srh(tvb, offset, pinfo, rthdr_tree, &rthdr_ti, rt); break; default: + dissect_routing6_unknown(tvb, offset, pinfo, rthdr_tree, &rthdr_ti, rt); break; } @@ -3069,6 +3088,11 @@ proto_register_ipv6(void) FT_UINT8, BASE_DEC, NULL, 0x0, "Routing Header Segments Left", HFILL } }, + { &hf_ipv6_routing_unknown_data, + { "Type-Specific Data", "ipv6.routing.unknown_data", + FT_BYTES, BASE_NONE, NULL, 0x0, + "Unknown routing header type-specific data", HFILL } + }, /* Source Routing Header */ { &hf_ipv6_routing_src_reserved, @@ -3340,8 +3364,8 @@ proto_register_ipv6(void) { "ipv6.routing.invalid_segleft", PI_PROTOCOL, PI_WARN, "IPv6 Routing Header segments left field must not exceed address count", EXPFILL } }, - { &ei_ipv6_routing_not_implemented, - { "ipv6.routing.not_implemented", PI_UNDECODED, PI_NOTE, + { &ei_ipv6_routing_undecoded, + { "ipv6.routing.undecoded", PI_UNDECODED, PI_NOTE, "Undecoded IPv6 routing header field", EXPFILL } } }; |