aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2009-03-18 07:36:53 +0000
committerAnders Broman <anders.broman@ericsson.com>2009-03-18 07:36:53 +0000
commitbd72a48963ffc218180c763de6e8d79095ab2236 (patch)
tree89598ef9c851f7fb7b9f57eaedbab67f14b2b239
parent85b8227311bc3c7460d1d52eb6692a311565d27c (diff)
From Munenori Ohuchi:
Enhacement to support 'WiMAX Forum/3GPP2 Proxy Mobile IPv4'. svn path=/trunk/; revision=27770
-rw-r--r--epan/dissectors/packet-mip.c166
1 files changed, 162 insertions, 4 deletions
diff --git a/epan/dissectors/packet-mip.c b/epan/dissectors/packet-mip.c
index e9ed26d90a..622b0315a2 100644
--- a/epan/dissectors/packet-mip.c
+++ b/epan/dissectors/packet-mip.c
@@ -2,6 +2,7 @@
* Routines for Mobile IP dissection
* Copyright 2000, Stefan Raab <sraab@cisco.com>
* Copyright 2007, Ville Nuorvala <Ville.Nuorvala@secgo.com>
+ * Copyright 2009, Ohuchi Munenori <ohuchi_at_iij.ad.jp>
*
* $Id$
*
@@ -97,12 +98,22 @@ static int hf_mip_utrpext_flags = -1;
static int hf_mip_utrpext_f = -1;
static int hf_mip_utrpext_reserved = -1;
static int hf_mip_utrpext_keepalive = -1;
+static int hf_mip_pmipv4nonskipext_stype = -1;
+static int hf_mip_pmipv4nonskipext_pernodeauthmethod = -1;
+static int hf_mip_pmipv4skipext_stype = -1;
+static int hf_mip_pmipv4skipext_interfaceid = -1;
+static int hf_mip_pmipv4skipext_deviceid_type = -1;
+static int hf_mip_pmipv4skipext_deviceid_id = -1;
+static int hf_mip_pmipv4skipext_subscriberid_type = -1;
+static int hf_mip_pmipv4skipext_subscriberid_id = -1;
+static int hf_mip_pmipv4skipext_accesstechnology_type = -1;
/* Initialize the subtree pointers */
static gint ett_mip = -1;
static gint ett_mip_flags = -1;
static gint ett_mip_ext = -1;
static gint ett_mip_exts = -1;
+static gint ett_mip_pmipv4_ext = -1;
/* Port used for Mobile IP */
#define UDP_PORT_MIP 434
@@ -181,6 +192,8 @@ static const value_string mip_reply_codes[]= {
{142, "Reg Deny (HA)- UDP Encapsulation Unavailable"},
{143, "Reg Deny (HA)- Register with Redirected HA"},
{144, "Reg Deny (HA)- MN Failed AAA Authentication"},
+ {149, "Reg Deny (HA)- PMIP_UNSUPPORTED"}, /* draft-leung-mip4-proxy-mode */
+ {150, "Reg Deny (HA)- PMIP_DISALLOWED"}, /* draft-leung-mip4-proxy-mode */
{192, "Reg Deny (HA)- Error Code for Experimental Use"},
{0, NULL}
};
@@ -200,6 +213,7 @@ typedef enum {
OLD_CVSE_EXT = 37, /* RFC 3115 */
CVSE_EXT = 38, /* RFC 3115 */
UDP_TUN_REP_EXT = 44, /* RFC 3519 */
+ PMIPv4_NON_SKIP_EXT = 47, /* draft-leung-mip4-proxy-mode */
MN_NAI_EXT = 131, /* RFC 2794 */
MF_CHALLENGE_EXT = 132, /* RFC 3012 */
OLD_NVSE_EXT = 133, /* RFC 3115 */
@@ -208,6 +222,7 @@ typedef enum {
DYN_HA_EXT = 139, /* RFC 4433 */
UDP_TUN_REQ_EXT = 144, /* RFC 3519 */
MSG_STR_EXT = 145,
+ PMIPv4_SKIP_EXT = 147, /* draft-leung-mip4-proxy-mode */
SKIP_EXP_EXT = 255 /* RFC 4064 */
} MIP_EXTS;
@@ -219,6 +234,7 @@ static const value_string mip_ext_types[]= {
{OLD_CVSE_EXT, "Critical Vendor/Organization Specific Extension"},
{CVSE_EXT, "Critical Vendor/Organization Specific Extension"},
{UDP_TUN_REP_EXT, "UDP Tunnel Reply Extension"},
+ {PMIPv4_NON_SKIP_EXT, "Proxy Mobile IPv4 Non-skippable Extension"},
{MN_NAI_EXT, "Mobile Node NAI Extension"},
{MF_CHALLENGE_EXT, "MN-FA Challenge Extension"},
{OLD_NVSE_EXT, "Normal Vendor/Organization Specific Extension"},
@@ -227,6 +243,7 @@ static const value_string mip_ext_types[]= {
{DYN_HA_EXT, "Dynamic HA Extension"},
{UDP_TUN_REQ_EXT, "UDP Tunnel Request Extension"},
{MSG_STR_EXT, "Message String Extension"},
+ {PMIPv4_SKIP_EXT, "Proxy Mobile IPv4 Skippable Extension"},
{SKIP_EXP_EXT, "Skippable Extension for Experimental use"},
{0, NULL}
};
@@ -271,6 +288,60 @@ static const value_string mip_utrpext_codes[]= {
{0, NULL}
};
+static const value_string mip_pmipv4nonskipext_stypes[]= {
+ {0, "Unknown"},
+ {1, "Per-Node Authentication Method"},
+ {0, NULL}
+};
+
+static const value_string mip_pmipv4nonskipext_pernodeauthmethod_types[]= {
+ {0, "Reserved"},
+ {1, "FA-HA Authentication"},
+ {2, "IPSec Authentication"},
+ {0, NULL}
+};
+
+#define PMIPv4_SKIPEXT_STYPE_INTERFACE_ID (1)
+#define PMIPv4_SKIPEXT_STYPE_DEVICE_ID (2)
+#define PMIPv4_SKIPEXT_STYPE_SUBSCRIBER_ID (3)
+#define PMIPv4_SKIPEXT_STYPE_ACCESS_TECHNOLOGY (4)
+static const value_string mip_pmipv4skipext_stypes[]= {
+ {0, "Unknown"},
+ {PMIPv4_SKIPEXT_STYPE_INTERFACE_ID, "Interface ID"},
+ {PMIPv4_SKIPEXT_STYPE_DEVICE_ID, "Device ID"},
+ {PMIPv4_SKIPEXT_STYPE_SUBSCRIBER_ID, "Subscriber ID"},
+ {PMIPv4_SKIPEXT_STYPE_ACCESS_TECHNOLOGY, "Access Technology Type"},
+ {0, NULL}
+};
+
+static const value_string mip_pmipv4skipext_deviceid_types[]= {
+ {0, "Reserved"},
+ {1, "Ethernet MAC address"},
+ {2, "Mobile Equipment Identifier (MEID)"},
+ {3, "International Mobile Equipment Identity (IMEI)"},
+ {4, "Electronic Serial Number (ESN)"},
+ {0, NULL}
+};
+
+static const value_string mip_pmipv4skipext_subscriberid_types[]= {
+ {0, "Reserved"},
+ {1, "International Mobile Subscriber Identity (IMSI)"},
+ {0, NULL}
+};
+
+static const value_string mip_pmipv4skipext_accesstechnology_types[]= {
+ {0, "Reserved"},
+ {1, "802.3"},
+ {2, "802.11a/b/g"},
+ {3, "802.16e"},
+ {4, "802.16m"},
+ {5, "3GPP EUTRAN/LTE"},
+ {6, "3GPP UTRAN/GERAN"},
+ {7, "3GPP2 1xRTT/HRPD"},
+ {8, "3GPP2 UMB"},
+ {0, NULL}
+};
+
static dissector_handle_t ip_handle;
/* Code to dissect extensions */
@@ -282,9 +353,12 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
proto_tree *ext_tree;
proto_tree *tf;
proto_tree *ext_flags_tree;
+ proto_tree *tp;
+ proto_tree *pmipv4_tree;
size_t ext_len;
guint8 ext_type;
guint8 ext_subtype=0;
+ guint8 pmipv4skipext_type;
guint16 flags;
size_t hdrLen;
@@ -300,7 +374,7 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
/* Get our extension info */
ext_type = tvb_get_guint8(tvb, offset);
- if (ext_type == GEN_AUTH_EXT) {
+ if (ext_type == GEN_AUTH_EXT || ext_type == PMIPv4_NON_SKIP_EXT) {
/*
* Very nasty . . breaks normal extensions, since the length is
* in the wrong place :(
@@ -321,8 +395,8 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
proto_tree_add_item(ext_tree, hf_mip_ext_type, tvb, offset, 1, ext_type);
offset++;
- if (ext_type != GEN_AUTH_EXT) {
- /* Another nasty hack since GEN_AUTH_EXT broke everything */
+ if (ext_type != GEN_AUTH_EXT || ext_type != PMIPv4_NON_SKIP_EXT) {
+ /* Another nasty hack since GEN_AUTH_EXT and PMIPv4_NON_SKIP_EXT broke everything */
proto_tree_add_uint(ext_tree, hf_mip_ext_len, tvb, offset, 1, ext_len);
offset++;
}
@@ -423,6 +497,44 @@ dissect_mip_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
/* keepalive interval */
proto_tree_add_item(ext_tree, hf_mip_utrpext_keepalive, tvb, offset + 4, 2, FALSE);
break;
+ case PMIPv4_NON_SKIP_EXT: /* draft-leung-mip4-proxy-mode */
+ /* sub-type */
+ proto_tree_add_item(ext_tree, hf_mip_pmipv4nonskipext_stype, tvb, offset, 1, ext_subtype);
+ offset++;
+ /* len */
+ proto_tree_add_item(ext_tree, hf_mip_ext_len, tvb, offset, 2, ext_len);
+ offset+=2;
+ if(ext_subtype == 1){
+ /* Sub-type == 1 : PMIPv4 Per-Node Authentication Method */
+ proto_tree_add_item(ext_tree, hf_mip_pmipv4nonskipext_pernodeauthmethod, tvb, offset, 1, FALSE);
+ }
+ break;
+ case PMIPv4_SKIP_EXT: /* draft-leung-mip4-proxy-mode */
+ /* sub-type */
+ ext_subtype = tvb_get_guint8(tvb, offset);
+ tp = proto_tree_add_text(ext_tree, tvb, offset, ext_len,
+ "PMIPv4 Sub-Type: %s",
+ val_to_str(ext_subtype, mip_pmipv4skipext_stypes, "Unknown Sub-Type %u"));
+ pmipv4_tree = proto_item_add_subtree(tp, ett_mip_pmipv4_ext);
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_stype, tvb, offset, 1, ext_subtype);
+
+ if (ext_subtype == PMIPv4_SKIPEXT_STYPE_INTERFACE_ID) {
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_interfaceid, tvb, offset + 1, ext_len-1, FALSE);
+ } else if (ext_subtype == PMIPv4_SKIPEXT_STYPE_DEVICE_ID) {
+ pmipv4skipext_type = tvb_get_guint8(tvb, offset + 1);
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_deviceid_type, tvb, offset + 1, 1, pmipv4skipext_type);
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_deviceid_id, tvb, offset + 2, ext_len - 2, FALSE);
+ } else if (ext_subtype == PMIPv4_SKIPEXT_STYPE_SUBSCRIBER_ID) {
+ pmipv4skipext_type = tvb_get_guint8(tvb, offset + 1);
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_subscriberid_type, tvb, offset + 1, 1, pmipv4skipext_type);
+ if (pmipv4skipext_type == 1) {
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_subscriberid_id, tvb, offset + 2, ext_len - 2, FALSE);
+ }
+ } else if (ext_subtype == PMIPv4_SKIPEXT_STYPE_ACCESS_TECHNOLOGY) {
+ pmipv4skipext_type = tvb_get_guint8(tvb, offset + 1);
+ proto_tree_add_item(pmipv4_tree, hf_mip_pmipv4skipext_accesstechnology_type, tvb, offset + 1, 1, pmipv4skipext_type);
+ }
+ break;
case OLD_CVSE_EXT: /* RFC 3115 */
case CVSE_EXT: /* RFC 3115 */
case OLD_NVSE_EXT: /* RFC 3115 */
@@ -971,7 +1083,52 @@ void proto_register_mip(void)
{ "Keepalive Interval", "mip.ext.utrp.keepalive",
FT_UINT16, BASE_DEC, NULL, 0,
"NAT Keepalive Interval", HFILL }
- }
+ },
+ { &hf_mip_pmipv4nonskipext_stype,
+ { "Sub-type", "mip.ext.pmipv4nonskipext.subtype",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4nonskipext_stypes), 0,
+ "PMIPv4 Skippable Extension Sub-type", HFILL }
+ },
+ { &hf_mip_pmipv4nonskipext_pernodeauthmethod,
+ { "Per-Node Authentication Method", "mip.ext.pmipv4nonskipext.pernodeauthmethod",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4nonskipext_pernodeauthmethod_types), 0,
+ "Per-Node Authentication Method", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_stype,
+ { "Sub-type", "mip.ext.pmipv4skipext.subtype",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4skipext_stypes), 0,
+ "PMIPv4 Non-skippable Extension Sub-type", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_interfaceid,
+ { "Interface ID", "mip.ext.pmipv4skipext.interfaceid",
+ FT_BYTES, BASE_HEX, NULL, 0,
+ "Interface ID", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_deviceid_type,
+ { "ID-Type", "mip.ext.pmipv4skipext.deviceid_type",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4skipext_deviceid_types), 0,
+ "Device ID-Type", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_deviceid_id,
+ { "Identifier", "mip.ext.pmipv4skipext.deviceid_id",
+ FT_BYTES, BASE_HEX, NULL, 0,
+ "Device ID Identifier", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_subscriberid_type,
+ { "ID-Type", "mip.ext.pmipv4skipext.subscriberid_type",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4skipext_subscriberid_types), 0,
+ "Subscriber ID-Type", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_subscriberid_id,
+ { "Identifier", "mip.ext.pmipv4skipext.subscriberid_id",
+ FT_BYTES, BASE_HEX, NULL, 0,
+ "Subscriber ID Identifier", HFILL }
+ },
+ { &hf_mip_pmipv4skipext_accesstechnology_type,
+ { "Access Technology Type", "mip.ext.pmipv4skipext.accesstechnology_type",
+ FT_UINT8, BASE_DEC, VALS(mip_pmipv4skipext_accesstechnology_types), 0,
+ "Access Technology Type", HFILL }
+ },
};
/* Setup protocol subtree array */
@@ -980,6 +1137,7 @@ void proto_register_mip(void)
&ett_mip_flags,
&ett_mip_ext,
&ett_mip_exts,
+ &ett_mip_pmipv4_ext,
};
/* Register the protocol name and description */