aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ipv6.c
diff options
context:
space:
mode:
authorBinh Trinh <beango@gmail.com>2016-07-30 00:44:21 -0400
committerJoão Valverde <j@v6e.pt>2016-07-31 13:00:36 +0000
commitd2cd779d2f0d713d2a7b585561ebd1f93a13187d (patch)
treedf7cd61c3c78ab09ceac60cc54b9fb83b5165198 /epan/dissectors/packet-ipv6.c
parent63f9ecbdd51c5163d58460d79f2dd858960babe8 (diff)
IPv6: Add support for embedded IPv4 addressess (RFC 6052)
For Well-Known Prefix 64:ff9b::/96. Change-Id: Ib2d7b42b9c7e6bbe388dca46d6a5eb516242c881 Reviewed-on: https://code.wireshark.org/review/16780 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.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c
index 07c0450aee..14a2778f58 100644
--- a/epan/dissectors/packet-ipv6.c
+++ b/epan/dissectors/packet-ipv6.c
@@ -137,6 +137,7 @@ static int hf_ipv6_src_6to4_sla_id = -1;
static int hf_ipv6_src_teredo_server_ipv4 = -1;
static int hf_ipv6_src_teredo_port = -1;
static int hf_ipv6_src_teredo_client_ipv4 = -1;
+static int hf_ipv6_src_embed_ipv4 = -1;
static int hf_ipv6_dst = -1;
static int hf_ipv6_dst_host = -1;
static int hf_ipv6_dst_sa_mac = -1;
@@ -146,6 +147,7 @@ static int hf_ipv6_dst_6to4_sla_id = -1;
static int hf_ipv6_dst_teredo_server_ipv4 = -1;
static int hf_ipv6_dst_teredo_port = -1;
static int hf_ipv6_dst_teredo_client_ipv4 = -1;
+static int hf_ipv6_dst_embed_ipv4 = -1;
static int hf_ipv6_addr = -1;
static int hf_ipv6_host = -1;
static int hf_ipv6_sa_mac = -1;
@@ -155,6 +157,7 @@ static int hf_ipv6_6to4_sla_id = -1;
static int hf_ipv6_teredo_server_ipv4 = -1;
static int hf_ipv6_teredo_port = -1;
static int hf_ipv6_teredo_client_ipv4 = -1;
+static int hf_ipv6_embed_ipv4 = -1;
static int hf_ipv6_opt = -1;
static int hf_ipv6_opt_type = -1;
static int hf_ipv6_opt_type_action = -1;
@@ -497,6 +500,13 @@ static const fragment_items ipv6_frag_items = {
"IPv6 fragments"
};
+/* Well-Known Prefix for IPv4-Embedded IPv6 Address: 64::FF9B::/96 */
+static const guint8 ipv6_embedded_ipv4_well_known_prefix[] = {
+ 0x00, 0x64, 0xFF, 0x9B,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
static dissector_table_t ip_dissector_table;
/* Reassemble fragmented datagrams */
@@ -2235,6 +2245,15 @@ dissect_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
PROTO_ITEM_SET_HIDDEN(ti);
}
+ /* Check for well-known prefix 64:ff9b::/96, rfc6052 */
+ if (memcmp(ip6_src->bytes, ipv6_embedded_ipv4_well_known_prefix, 12) == 0) {
+ ti = proto_tree_add_item(ipv6_tree, hf_ipv6_src_embed_ipv4, tvb, offset + IP6H_SRC + 12, 4, ENC_NA);
+ PROTO_ITEM_SET_GENERATED(ti);
+ ti = proto_tree_add_item(ipv6_tree, hf_ipv6_embed_ipv4, tvb, offset + IP6H_SRC + 12, 4, ENC_NA);
+ PROTO_ITEM_SET_GENERATED(ti);
+ PROTO_ITEM_SET_HIDDEN(ti);
+ }
+
/* Add different items for the destination address */
ti = proto_tree_add_item(ipv6_tree, hf_ipv6_addr, tvb,
offset + IP6H_DST, IPv6_ADDR_SIZE, ENC_NA);
@@ -2313,6 +2332,15 @@ dissect_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
}
+
+ /* Check for well-known prefix 64:ff9b::/96, rfc6052 */
+ if (memcmp(ip6_dst->bytes, ipv6_embedded_ipv4_well_known_prefix, 12) == 0) {
+ ti = proto_tree_add_item(ipv6_tree, hf_ipv6_dst_embed_ipv4, tvb, offset + IP6H_DST + 12, 4, ENC_NA);
+ PROTO_ITEM_SET_GENERATED(ti);
+ ti = proto_tree_add_item(ipv6_tree, hf_ipv6_embed_ipv4, tvb, offset + IP6H_DST + 12, 4, ENC_NA);
+ PROTO_ITEM_SET_GENERATED(ti);
+ PROTO_ITEM_SET_HIDDEN(ti);
+ }
}
#ifdef HAVE_GEOIP_V6
@@ -2520,6 +2548,11 @@ proto_register_ipv6(void)
FT_IPv4, BASE_NONE, NULL, 0x0,
"Source IPv6 Teredo Client Encapsulated IPv4 Address", HFILL }
},
+ { &hf_ipv6_src_embed_ipv4,
+ { "Source Embedded IPv4", "ipv6.src_embed_ipv4",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Source Embedded IPv4 Address", HFILL }
+ },
{ &hf_ipv6_dst,
{ "Destination", "ipv6.dst",
FT_IPv6, BASE_NONE, NULL, 0x0,
@@ -2565,6 +2598,11 @@ proto_register_ipv6(void)
FT_IPv4, BASE_NONE, NULL, 0x0,
"Destination IPv6 Teredo Client Encapsulated IPv4 Address", HFILL }
},
+ { &hf_ipv6_dst_embed_ipv4,
+ { "Destination Embedded IPv4", "ipv6.dst_embed_ipv4",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Destination Embedded IPv4 Address", HFILL }
+ },
{ &hf_ipv6_addr,
{ "Source or Destination Address", "ipv6.addr",
FT_IPv6, BASE_NONE, NULL, 0x0,
@@ -2610,6 +2648,11 @@ proto_register_ipv6(void)
FT_IPv4, BASE_NONE, NULL, 0x0,
"IPv6 Teredo Client Encapsulated IPv4 Address", HFILL }
},
+ { &hf_ipv6_embed_ipv4,
+ { "Embedded IPv4", "ipv6.embed_ipv4",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ "Embedded IPv4 Address", HFILL }
+ },
#ifdef HAVE_GEOIP_V6
{ &hf_geoip_country,