aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mip.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2013-03-28 16:55:06 +0000
committerAnders Broman <anders.broman@ericsson.com>2013-03-28 16:55:06 +0000
commit8e1b0ac304bee7f573aabcc568c7df327080f6f0 (patch)
treeb2fcc983048084b7f9326d4d282f8825308dd5b9 /epan/dissectors/packet-mip.c
parentfc78e677a85fd39f41748e7e2f2d77b9895d9a67 (diff)
Register a dissector table for Normal Vendor/Organization Specific Extension(NVSE) and use it for 3GPP2.
svn path=/trunk/; revision=48623
Diffstat (limited to 'epan/dissectors/packet-mip.c')
-rw-r--r--epan/dissectors/packet-mip.c157
1 files changed, 139 insertions, 18 deletions
diff --git a/epan/dissectors/packet-mip.c b/epan/dissectors/packet-mip.c
index aeb413aa14..54960e4ff5 100644
--- a/epan/dissectors/packet-mip.c
+++ b/epan/dissectors/packet-mip.c
@@ -33,6 +33,11 @@
#include <epan/packet.h>
#include <epan/sminmpec.h>
+void proto_register_mip(void);
+void proto_reg_handoff_mip(void);
+
+static dissector_table_t mip_nvse_ext_dissector_table;
+
/* Initialize the protocol and registered fields */
static int proto_mip = -1;
static int hf_mip_type = -1;
@@ -110,6 +115,13 @@ static int hf_mip_nvse_reserved = -1;
static int hf_mip_nvse_vendor_org_id = -1;
static int hf_mip_nvse_vendor_nvse_type = -1;
static int hf_mip_nvse_vendor_nvse_value = -1;
+static int hf_mip_nvse_3gpp2_type = -1;
+static int hf_mip_nvse_3gpp2_type17_entity = -1;
+static int hf_mip_nvse_3gpp2_type17_subtype1 = -1;
+static int hf_mip_nvse_3gpp2_type17_subtype2 = -1;
+static int hf_mip_nvse_3gpp2_type17_length = -1;
+static int hf_mip_nvse_3gpp2_type17_prim_dns = -1;
+static int hf_mip_nvse_3gpp2_type17_sec_dns = -1;
/* Initialize the subtree pointers */
static gint ett_mip = -1;
@@ -394,11 +406,70 @@ static const value_string mip_cvse_verizon_cvse_types[]= {
{0, NULL}
};
+
+
+static const value_string mip_nvse_3gpp2_type_vals[]= {
+ {17, "DNS server IP address"},
+ {0, NULL}
+};
+
+static const value_string mip_nvse_3gpp2_type17_entity_vals[]= {
+ {0, "Unknown"},
+ {1, "HAAA"},
+ {2, "VAAA"},
+ {3, "HA"},
+ {0, NULL}
+};
+
static dissector_handle_t ip_handle;
+/* Code to dissect 3GPP2 extensions */
+
+static int
+dissect_mip_priv_ext_3gpp2(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
+{
+ int offset = 0;
+ guint16 type;
+ int length = tvb_reported_length(tvb);
+
+ type = tvb_get_ntohs(tvb,offset);
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset+=2;
+
+ switch(type){
+ case 17: /* DNS server IP address X.S0011-002-C v3.0*/
+ /* Entity-Type */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_entity, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Sub-Type1 */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_subtype1, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Length */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_length, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* DNS server IP address */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_prim_dns, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset+=4;
+ /* Sub-Type2 */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_subtype2, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Length */
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_length, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* DNS server IP address.*/
+ proto_tree_add_item(tree, hf_mip_nvse_3gpp2_type17_sec_dns, tvb, offset, 4, ENC_BIG_ENDIAN);
+ break;
+ default:
+ proto_tree_add_text(tree, tvb, offset, -1, " Data not dissected yet");
+ break;
+ }
+
+ return length;
+}
+
/* Code to dissect extensions */
static void
-dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
+dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree, packet_info *pinfo)
{
proto_item *ti;
proto_tree *exts_tree=NULL;
@@ -415,7 +486,6 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
gint hdrLen;
guint32 cvse_vendor_id;
guint16 cvse_vendor_type;
- guint16 nvse_vendor_type;
int cvse_local_offset= 0;
int nvse_local_offset= 0;
@@ -635,21 +705,30 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
case OLD_NVSE_EXT: /* RFC 3115 */
case NVSE_EXT: /* RFC 3115 */
- proto_tree_add_item(ext_tree, hf_mip_nvse_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+ {
+ guint32 nvse_vendor_org_id;
+ tvbuff_t *next_tvb;
- /* Vendor/Org ID */
- /*Vendor ID & nvse type & nvse value are included in ext_len, so do not increment offset for them here.*/
- nvse_local_offset = offset + hdrLen;
- proto_tree_add_item(ext_tree, hf_mip_nvse_vendor_org_id, tvb, nvse_local_offset, 4, ENC_BIG_ENDIAN);
- nvse_local_offset+=4;
-
- /*Vendor NVSE Type*/
- nvse_vendor_type = tvb_get_ntohs(tvb, nvse_local_offset);
- proto_tree_add_uint(ext_tree, hf_mip_nvse_vendor_nvse_type, tvb, nvse_local_offset, 2, nvse_vendor_type);
- nvse_local_offset+=2;
-
- /* Vendor-NVSE-Value */
- proto_tree_add_item(ext_tree, hf_mip_nvse_vendor_nvse_value, tvb, nvse_local_offset, ext_len - 8, ENC_NA);
+ proto_tree_add_item(ext_tree, hf_mip_nvse_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ /* Vendor/Org ID */
+ /*Vendor ID & nvse type & nvse value are included in ext_len, so do not increment offset for them here.*/
+ nvse_local_offset = offset + hdrLen;
+ nvse_vendor_org_id = tvb_get_ntohl(tvb, nvse_local_offset);
+ proto_tree_add_item(ext_tree, hf_mip_nvse_vendor_org_id, tvb, nvse_local_offset, 4, ENC_BIG_ENDIAN);
+ nvse_local_offset+=4;
+
+ next_tvb = tvb_new_subset(tvb, nvse_local_offset, ext_len-6, ext_len-6);
+ if (!dissector_try_uint(mip_nvse_ext_dissector_table, nvse_vendor_org_id, next_tvb, pinfo, ext_tree)){
+
+ /*Vendor NVSE Type*/
+ proto_tree_add_item(ext_tree, hf_mip_nvse_vendor_nvse_type, tvb, nvse_local_offset, 2, ENC_BIG_ENDIAN);
+ nvse_local_offset+=2;
+
+ /* Vendor-NVSE-Value */
+ proto_tree_add_item(ext_tree, hf_mip_nvse_vendor_nvse_value, tvb, nvse_local_offset, ext_len - 8, ENC_NA);
+ }
+ }
break;
case MF_CHALLENGE_EXT: /* RFC 3012 */
@@ -888,7 +967,7 @@ dissect_mip( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (tree) {
if (tvb_reported_length_remaining(tvb, offset) > 0)
- dissect_mip_extensions(tvb, offset, mip_tree);
+ dissect_mip_extensions(tvb, offset, mip_tree, pinfo);
}
} /* dissect_mip */
@@ -1276,7 +1355,42 @@ void proto_register_mip(void)
{ "Vendor Value", "mip.ext.nvse.vendor_value",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }
- }
+ },
+ { &hf_mip_nvse_3gpp2_type ,
+ { "Type", "mip.ext.nvse.3gpp2.type",
+ FT_UINT16, BASE_DEC, VALS(mip_nvse_3gpp2_type_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_entity,
+ { "Entity-Type", "mip.ext.nvse.3gpp2.type17.entity",
+ FT_UINT8, BASE_DEC, VALS(mip_nvse_3gpp2_type17_entity_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_subtype1,
+ { "Sub-Type1", "mip.ext.nvse.3gpp2.type17.subtype1",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_length,
+ { "Length", "mip.ext.nvse.3gpp2.type17.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_subtype2,
+ { "Sub-Type2", "mip.ext.nvse.3gpp2.type17.subtype2",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_prim_dns,
+ { "Primary DNS", "mip.ext.nvse.3gpp2.type17.prim_dns",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_mip_nvse_3gpp2_type17_sec_dns,
+ { "Secondary DNS", "mip.ext.nvse.3gpp2.type17.sec_dns",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
};
/* Setup protocol subtree array */
@@ -1297,6 +1411,9 @@ void proto_register_mip(void)
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_mip, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
+ mip_nvse_ext_dissector_table = register_dissector_table("mip.nvse_ext", "Normal Vendor/Organization Specific Extension", FT_UINT32, BASE_DEC);
+
}
void
@@ -1307,6 +1424,10 @@ proto_reg_handoff_mip(void)
mip_handle = find_dissector("mip");
ip_handle = find_dissector("ip");
dissector_add_uint("udp.port", UDP_PORT_MIP, mip_handle);
+
+ /* Register as dissector for 3GPP2 NVSE */
+ dissector_add_uint("mip.nvse_ext", VENDOR_THE3GPP2, new_create_dissector_handle(dissect_mip_priv_ext_3gpp2, proto_mip));
+
}