aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2016-07-04 22:41:29 +0200
committerMichael Mann <mmann78@netscape.net>2016-07-05 00:06:38 +0000
commitfdd87a1e41db7039b0af5bb15f40b83db1ca3a96 (patch)
tree19399810a2f169f6ef068233049252ee81ae5e41 /epan
parent308a538addd816431732d6f0ac35f7d2bdc76712 (diff)
Network-Based IP Flow Mobility (NBIFOM) dissector
Based on 3GPP 24.161 V13.1.0 Change-Id: I7bf635c862bf7e0b73fd05bc8a55c900d1f4dd87 Reviewed-on: https://code.wireshark.org/review/16291 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com> Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/Makefile.am1
-rw-r--r--epan/dissectors/packet-gsm_a_gm.c16
-rw-r--r--epan/dissectors/packet-nas_eps.c53
-rw-r--r--epan/dissectors/packet-nbifom.c546
5 files changed, 596 insertions, 21 deletions
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index 89b9b7a22c..38e2149ba1 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -937,6 +937,7 @@ set(DISSECTOR_SRC
packet-nat-pmp.c
packet-nb_rtpmux.c
packet-nbd.c
+ packet-nbifom.c
packet-nbipx.c
packet-nbt.c
packet-ncp-nmas.c
diff --git a/epan/dissectors/Makefile.am b/epan/dissectors/Makefile.am
index 49bc696347..70edc66e62 100644
--- a/epan/dissectors/Makefile.am
+++ b/epan/dissectors/Makefile.am
@@ -966,6 +966,7 @@ DISSECTOR_SRC = \
packet-nat-pmp.c \
packet-nb_rtpmux.c \
packet-nbd.c \
+ packet-nbifom.c \
packet-nbipx.c \
packet-nbt.c \
packet-ncp-nmas.c \
diff --git a/epan/dissectors/packet-gsm_a_gm.c b/epan/dissectors/packet-gsm_a_gm.c
index 2b3420748a..95f65ae5b9 100644
--- a/epan/dissectors/packet-gsm_a_gm.c
+++ b/epan/dissectors/packet-gsm_a_gm.c
@@ -547,6 +547,7 @@ static expert_field ei_gsm_a_gm_undecoded = EI_INIT;
static dissector_handle_t rrc_irat_ho_info_handle;
static dissector_handle_t lte_rrc_ue_eutra_cap_handle;
+static dissector_handle_t nbifom_handle;
static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */
@@ -4248,7 +4249,7 @@ static const value_string gsm_a_gm_sel_bearer_ctrl_mode_vals[] = {
static const value_string gsm_a_gm_nbifom_mode_vals[] = {
{ 0, "UE-initiated" },
- { 1, "network-initiated" },
+ { 1, "Network-initiated" },
{ 0, NULL }
};
@@ -5834,7 +5835,13 @@ de_sm_wlan_offload_accept(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U
static guint16
de_sm_nbifom_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_item(tree, hf_gsm_a_sm_nbifom_cont, tvb, offset, len, ENC_NA);
+ if (nbifom_handle) {
+ tvbuff_t *nbifom_tvb = tvb_new_subset_length(tvb, offset, len);
+
+ call_dissector(nbifom_handle, nbifom_tvb, pinfo, tree);
+ } else {
+ proto_tree_add_item(tree, hf_gsm_a_sm_nbifom_cont, tvb, offset, len, ENC_NA);
+ }
return len;
}
@@ -7121,8 +7128,8 @@ dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32
curr_len = len;
pinfo->p2p_dir = P2P_DIR_UNKNOWN;
- /* Network or the MS */
- pinfo->link_dir = LINK_DIR_UNKNOWN;
+ /* Network or the MS; do not reset link_dir in case it was set by lower layers */
+ /* pinfo->link_dir = LINK_DIR_UNKNOWN; */
ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
@@ -8868,6 +8875,7 @@ proto_reg_handoff_gsm_a_gm(void)
{
rrc_irat_ho_info_handle = find_dissector_add_dependency("rrc.irat.irat_ho_info", proto_a_gm);
lte_rrc_ue_eutra_cap_handle = find_dissector_add_dependency("lte-rrc.ue_eutra_cap", proto_a_gm);
+ nbifom_handle = find_dissector_add_dependency("nbifom", proto_a_gm);
}
/*
diff --git a/epan/dissectors/packet-nas_eps.c b/epan/dissectors/packet-nas_eps.c
index 73c527d46a..7852177435 100644
--- a/epan/dissectors/packet-nas_eps.c
+++ b/epan/dissectors/packet-nas_eps.c
@@ -50,6 +50,7 @@ static int proto_nas_eps = -1;
/* Dissector handles */
static dissector_handle_t gsm_a_dtap_handle;
static dissector_handle_t lpp_handle;
+static dissector_handle_t nbifom_handle;
/* Forward declaration */
static void disect_nas_eps_esm_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset);
@@ -219,6 +220,7 @@ static int hf_nas_eps_esm_pdn_ipv6_if_id = -1;
static int hf_nas_eps_esm_eplmnc = -1;
static int hf_nas_eps_esm_ratc = -1;
static int hf_nas_eps_esm_linked_bearer_id = -1;
+static int hf_nas_eps_esm_nbifom_cont = -1;
static int hf_nas_eps_esm_remote_ue_context_list_nb_ue_contexts = -1;
static int hf_nas_eps_esm_remote_ue_context_list_ue_context_len = -1;
static int hf_nas_eps_esm_remote_ue_context_list_ue_context_nb_user_id = -1;
@@ -2905,9 +2907,20 @@ static const value_string nas_eps_esm_request_type_values[] = {
*/
/*
* 9.9.4.19 NBIFOM container
- * See subclause 10.5.6.24 in 3GPP TS 24.008
- * packet-gsm_a_gm.c
*/
+static guint16
+de_esm_nbifom_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ if (nbifom_handle) {
+ tvbuff_t *nbifom_tvb = tvb_new_subset_length(tvb, offset, len);
+
+ call_dissector(nbifom_handle, nbifom_tvb, pinfo, tree);
+ } else {
+ proto_tree_add_item(tree, hf_nas_eps_esm_nbifom_cont, tvb, offset, len, ENC_NA);
+ }
+
+ return len;
+}
/*
* 9.9.4.20 Remote UE context list
@@ -3334,7 +3347,7 @@ guint16 (*esm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, g
NULL, /* 9.9.4.16 Traffic flow template */
NULL, /* 9.9.4.17 Transaction identifier */
NULL, /* 9.9.4.18 WLAN offload acceptability */
- NULL, /* 9.9.4.19 NBIFOM container */
+ de_esm_nbifom_cont, /* 9.9.4.19 NBIFOM container */
de_esm_remote_ue_context_list, /* 9.9.4.20 Remote UE context list */
de_esm_pkmf_address, /* 9.9.4.21 PKMF address */
de_esm_hdr_compr_config, /* 9.9.4.22 Header compression configuration */
@@ -4460,7 +4473,7 @@ nas_esm_act_ded_eps_bearer_ctx_acc(tvbuff_t *tvb, proto_tree *tree, packet_info
/* 27 Protocol configuration options Protocol configuration options 9.9.4.11 O TLV 3-253 */
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL );
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4488,7 +4501,7 @@ nas_esm_act_ded_eps_bearer_ctx_rej(tvbuff_t *tvb, proto_tree *tree, packet_info
/* 27 Protocol configuration options Protocol configuration options 9.9.4.11 O TLV 3-253 */
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL );
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4541,7 +4554,7 @@ nas_esm_act_ded_eps_bearer_ctx_req(tvbuff_t *tvb, proto_tree *tree, packet_info
/* C- WLAN offload indication WLAN offload indication 9.9.4.18 O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4644,7 +4657,7 @@ nas_esm_act_def_eps_bearer_ctx_req(tvbuff_t *tvb, proto_tree *tree, packet_info
/* C- WLAN offload indication WLAN offload indication 9.9.4.18 O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 66 Header compression configuration Header compression configuration 9.9.4.22 O TLV 3-TBD */
ELEM_OPT_TLV(0x66, NAS_PDU_TYPE_ESM, DE_ESM_HDR_COMPR_CONFIG, NULL);
/* 9- Control plane only indication Control plane only indication 9.9.4.23 O TV 1 */
@@ -4682,7 +4695,7 @@ nas_esm_bearer_res_all_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
/* 6B Re-attempt indicator Re-attempt indicator 9.9.4.13A O TLV 3 */
ELEM_OPT_TLV(0x6B, NAS_PDU_TYPE_ESM, DE_ESM_RE_ATTEMPT_IND, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4725,7 +4738,7 @@ nas_esm_bearer_res_all_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
/* C- Device properties Device properties 9.9.2.0A O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4756,7 +4769,7 @@ nas_esm_bearer_res_mod_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
/* 6B Re-attempt indicator Re-attempt indicator 9.9.4.13A O TLV 3 */
ELEM_OPT_TLV(0x6B, NAS_PDU_TYPE_ESM, DE_ESM_RE_ATTEMPT_IND, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4799,7 +4812,7 @@ nas_esm_bearer_res_mod_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
/* C- Device properties Device properties 9.9.2.0A O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 66 Header compression configuration Header compression configuration 9.9.4.22 O TLV 3-TBD */
ELEM_OPT_TLV(0x66, NAS_PDU_TYPE_ESM, DE_ESM_HDR_COMPR_CONFIG, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
@@ -4858,7 +4871,7 @@ nas_esm_deact_eps_bearer_ctx_req(tvbuff_t *tvb, proto_tree *tree, packet_info *p
/* C- WLAN offload indication WLAN offload indication 9.9.4.18 O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4964,7 +4977,7 @@ nas_esm_mod_eps_bearer_ctx_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pin
/* 27 Protocol configuration options Protocol configuration options 9.9.4.11 O TLV 3-253 */
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL );
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -4991,7 +5004,7 @@ nas_esm_mod_eps_bearer_ctx_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pin
/* 27 Protocol configuration options Protocol configuration options 9.9.4.11 O TLV 3-253 */
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL );
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -5035,7 +5048,7 @@ nas_esm_mod_eps_bearer_ctx_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pin
/* C- WLAN offload indication WLAN offload indication 9.9.4.18 O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 66 Header compression configuration Header compression configuration 9.9.4.22 O TLV 3-TBD */
ELEM_OPT_TLV(0x66, NAS_PDU_TYPE_ESM, DE_ESM_HDR_COMPR_CONFIG, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
@@ -5089,7 +5102,7 @@ nas_esm_pdn_con_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32
/* 6B Re-attempt indicator Re-attempt indicator 9.9.4.13A O TLV 3 */
ELEM_OPT_TLV(0x6B, NAS_PDU_TYPE_ESM, DE_ESM_RE_ATTEMPT_IND, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL);
@@ -5136,7 +5149,7 @@ nas_esm_pdn_con_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32
/* C- Device properties Device properties 9.9.2.0A O TV 1 */
ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
/* 33 NBIFOM container NBIFOM container 9.9.4.19 O TLV 3-257 */
- ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
+ ELEM_OPT_TLV(0x33, NAS_PDU_TYPE_ESM, DE_ESM_NBIFOM_CONT, NULL);
/* 66 Header compression configuration Header compression configuration 9.9.4.22 O TLV 3-TBD */
ELEM_OPT_TLV(0x66, NAS_PDU_TYPE_ESM, DE_ESM_HDR_COMPR_CONFIG, NULL);
/* 7B Extended protocol configuration options Extended protocol configuration options 9.9.4.26 O TLV-E 4-65538 */
@@ -6568,6 +6581,11 @@ proto_register_nas_eps(void)
FT_UINT8,BASE_DEC, VALS(nas_eps_esm_linked_bearer_id_vals), 0x0,
NULL, HFILL }
},
+ { &hf_nas_eps_esm_nbifom_cont,
+ { "NBIFOM container content","nas_eps.esm.nbifom_cont",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_nas_eps_esm_remote_ue_context_list_nb_ue_contexts,
{ "Number of remote UE contexts","nas_eps.esm.remote_ue_context_list.nb_ue_contexts",
FT_UINT8, BASE_DEC, NULL, 0x0,
@@ -6934,6 +6952,7 @@ proto_reg_handoff_nas_eps(void)
{
gsm_a_dtap_handle = find_dissector_add_dependency("gsm_a_dtap", proto_nas_eps);
lpp_handle = find_dissector_add_dependency("lpp", proto_nas_eps);
+ nbifom_handle = find_dissector_add_dependency("nbifom", proto_nas_eps);
}
/*
diff --git a/epan/dissectors/packet-nbifom.c b/epan/dissectors/packet-nbifom.c
new file mode 100644
index 0000000000..0a2d716fa2
--- /dev/null
+++ b/epan/dissectors/packet-nbifom.c
@@ -0,0 +1,546 @@
+/* packet-nbifom.c
+ * Routines for Network-Based IP Flow Mobility (NBIFOM) dissection
+ * 3GPP TS 24.161 V13.1.0 (2016-06) Release 13
+ * Copyright 2016, Pascal Quantin <pascal.quantin@gmail.com>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+
+static int proto_nbifom = -1;
+static int hf_nbifom_param_id_ul = -1;
+static int hf_nbifom_param_id_dl = -1;
+static int hf_nbifom_param_contents_len = -1;
+static int hf_nbifom_param_contents_dflt_access = -1;
+static int hf_nbifom_param_contents_status = -1;
+static int hf_nbifom_param_contents_ran_rules_handling = -1;
+static int hf_nbifom_param_contents_ran_rules_status = -1;
+static int hf_nbifom_param_contents_access_use_ind_spare = -1;
+static int hf_nbifom_param_contents_access_use_ind_wlan_access_usable_val = -1;
+static int hf_nbifom_param_contents_access_use_ind_3gpp_access_usable_val = -1;
+static int hf_nbifom_param_contents_mode = -1;
+static int hf_nbifom_param_contents_rem_bytes = -1;
+static int hf_nbifom_routing_rule_len = -1;
+static int hf_nbifom_routing_rule_id = -1;
+static int hf_nbifom_routing_rule_routing_access = -1;
+static int hf_nbifom_routing_rule_spare = -1;
+static int hf_nbifom_routing_rule_op_code = -1;
+static int hf_nbifom_routing_rule_prio = -1;
+static int hf_nbifom_routing_rule_flags = -1;
+static int hf_nbifom_routing_rule_flags_prot_type_nxt_hdr = -1;
+static int hf_nbifom_routing_rule_flags_ipsec_spi = -1;
+static int hf_nbifom_routing_rule_flags_dst_addr_prefix_len = -1;
+static int hf_nbifom_routing_rule_flags_src_addr_prefix_len = -1;
+static int hf_nbifom_routing_rule_flags_dst_ipv6_addr = -1;
+static int hf_nbifom_routing_rule_flags_src_ipv6_addr = -1;
+static int hf_nbifom_routing_rule_flags_dst_ipv4_addr = -1;
+static int hf_nbifom_routing_rule_flags_src_ipv4_addr = -1;
+static int hf_nbifom_routing_rule_flags_spare_bits0xc0 = -1;
+static int hf_nbifom_routing_rule_flags_flow_label = -1;
+static int hf_nbifom_routing_rule_flags_tos = -1;
+static int hf_nbifom_routing_rule_flags_end_dst_port_range = -1;
+static int hf_nbifom_routing_rule_flags_start_dst_port_range = -1;
+static int hf_nbifom_routing_rule_flags_end_src_port_range = -1;
+static int hf_nbifom_routing_rule_flags_start_src_port_range = -1;
+static int hf_nbifom_routing_rule_flags_spare_bits0xffff = -1;
+static int hf_nbifom_routing_rule_src_ipv4_addr = -1;
+static int hf_nbifom_routing_rule_dst_ipv4_addr = -1;
+static int hf_nbifom_routing_rule_src_ipv6_addr = -1;
+static int hf_nbifom_routing_rule_dst_ipv6_addr = -1;
+static int hf_nbifom_routing_rule_src_addr_prefix_len = -1;
+static int hf_nbifom_routing_rule_dst_addr_prefix_len = -1;
+static int hf_nbifom_routing_rule_ipsec_spi = -1;
+static int hf_nbifom_routing_rule_prot_type_nxt_hdr = -1;
+static int hf_nbifom_routing_rule_start_src_port_range = -1;
+static int hf_nbifom_routing_rule_end_src_port_range = -1;
+static int hf_nbifom_routing_rule_start_dst_port_range = -1;
+static int hf_nbifom_routing_rule_end_dst_port_range = -1;
+static int hf_nbifom_routing_rule_tos = -1;
+static int hf_nbifom_routing_rule_flow_label = -1;
+
+static gint ett_nbifom = -1;
+static gint ett_nbifom_param_contents = -1;
+static gint ett_nbifom_routing_rule = -1;
+static gint ett_nbifom_routing_rule_flags = -1;
+
+static const value_string nbifom_param_id_ue_to_nw_vals[] = {
+ { 0x00, "Not assigned" },
+ { 0x01, "NBIFOM mode" },
+ { 0x02, "NBIFOM default access" },
+ { 0x03, "NBIFOM status" },
+ { 0x04, "NBIFOM routing rules" },
+ { 0x05, "NBIFOM IP flow mapping" },
+ { 0x06, "Not assigned" },
+ { 0x07, "NBIFOM RAN rules status" },
+ { 0x08, "NBIFOM access usability indication" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_param_id_nw_to_ue_vals[] = {
+ { 0x00, "Not assigned" },
+ { 0x01, "NBIFOM mode" },
+ { 0x02, "NBIFOM default access" },
+ { 0x03, "NBIFOM status" },
+ { 0x04, "NBIFOM routing rules" },
+ { 0x05, "Not assigned" },
+ { 0x06, "NBIFOM RAN rules handling" },
+ { 0x07, "Not assigned" },
+ { 0x08, "Not assigned" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_dflt_access_vals[] = {
+ { 0x01, "3GPP access" },
+ { 0x02, "Non-3GPP access" },
+ { 0, NULL },
+};
+
+static const value_string nbifom_status_vals[] = {
+ { 0x00, "Accepted" },
+ { 0x1a, "Insufficient resources" },
+ { 0x22, "Service option temporarily out of order" },
+ { 0x25, "Requested service option not subscribed" },
+ { 0x39, "Incorrect indication in the routing rule operation" },
+ { 0x3a, "Unknown information in IP flow filter(s)" },
+ { 0x3f, "Request rejected, unspecified" },
+ { 0x6f, "Protocol error, unspecified" },
+ { 0x82, "Unknown routing access information" },
+ { 0, NULL },
+};
+
+static const value_string nbifom_ran_rules_handling_vals[] = {
+ { 0x01, "RAN rules handling parameter is not set" },
+ { 0x02, "RAN rules handling parameter is set" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_ran_rules_status_vals[] = {
+ { 0x01, "No indication" },
+ { 0x02, "Move-traffic-from-WLAN indication" },
+ { 0x03, "Move-traffic-to-WLAN indication" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_wlan_access_usable_vals[] = {
+ { 0x00, "No change in usability of WLAN access" },
+ { 0x01, "WLAN access becomes usable" },
+ { 0x02, "WLAN access becomes unusable" },
+ { 0x03, "Reserved" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_3gpp_access_usable_vals[] = {
+ { 0x00, "No change in usability of 3GPP access" },
+ { 0x01, "3GPP access becomes usable" },
+ { 0x02, "3GPP access becomes unusable" },
+ { 0x03, "Reserved" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_mode_vals[] = {
+ { 0x01, "UE-initiated NBIFOM mode" },
+ { 0x02, "Network-initiated NBIFOM mode" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_routing_access_vals[] = {
+ { 0x01, "3GPP access" },
+ { 0x02, "Non-3GPP access" },
+ { 0, NULL }
+};
+
+static const value_string nbifom_op_code_vals[] = {
+ { 0x00, "Spare" },
+ { 0x01, "Create routing rule" },
+ { 0x02, "Delete routing rule" },
+ { 0x03, "Replace existing routing rule" },
+ { 0x04, "Reserved" },
+ { 0, NULL }
+};
+
+static void
+dissect_nbifom_routing_rules(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset, guint32 params_content_len)
+{
+ gint curr_offset = offset;
+ guint32 i = 0, routing_rule_len;
+ proto_item *item;
+ proto_tree *subtree;
+ guint64 flags;
+
+ while ((curr_offset - offset) < (gint)params_content_len) {
+ static const int *flags1[] = {
+ &hf_nbifom_routing_rule_routing_access,
+ &hf_nbifom_routing_rule_spare,
+ &hf_nbifom_routing_rule_op_code,
+ NULL
+ };
+ static const int *flags2[] = {
+ &hf_nbifom_routing_rule_flags_prot_type_nxt_hdr,
+ &hf_nbifom_routing_rule_flags_ipsec_spi,
+ &hf_nbifom_routing_rule_flags_dst_addr_prefix_len,
+ &hf_nbifom_routing_rule_flags_src_addr_prefix_len,
+ &hf_nbifom_routing_rule_flags_dst_ipv6_addr,
+ &hf_nbifom_routing_rule_flags_src_ipv6_addr,
+ &hf_nbifom_routing_rule_flags_dst_ipv4_addr,
+ &hf_nbifom_routing_rule_flags_src_ipv4_addr,
+ &hf_nbifom_routing_rule_flags_spare_bits0xc0,
+ &hf_nbifom_routing_rule_flags_flow_label,
+ &hf_nbifom_routing_rule_flags_tos,
+ &hf_nbifom_routing_rule_flags_end_dst_port_range,
+ &hf_nbifom_routing_rule_flags_start_dst_port_range,
+ &hf_nbifom_routing_rule_flags_end_src_port_range,
+ &hf_nbifom_routing_rule_flags_start_src_port_range,
+ &hf_nbifom_routing_rule_flags_spare_bits0xffff,
+ NULL
+ };
+
+ subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nbifom_routing_rule, &item, "Routing Rule %u", ++i);
+ proto_tree_add_item_ret_uint(subtree, hf_nbifom_routing_rule_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &routing_rule_len);
+ proto_item_set_len(item, routing_rule_len+1);
+ curr_offset++;
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ proto_tree_add_bitmask_list(subtree, tvb, curr_offset, 1, flags1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_prio, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ proto_tree_add_bitmask_ret_uint64(subtree, tvb, curr_offset, hf_nbifom_routing_rule_flags,
+ ett_nbifom_routing_rule_flags, flags2, ENC_BIG_ENDIAN, &flags);
+ curr_offset += 4;
+ if (flags & 0x01000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_src_ipv4_addr, tvb, curr_offset, 4, ENC_NA);
+ curr_offset += 4;
+ }
+ if (flags & 0x02000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_dst_ipv4_addr, tvb, curr_offset, 4, ENC_NA);
+ curr_offset += 4;
+ }
+ if (flags & 0x04000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_src_ipv6_addr, tvb, curr_offset, 16, ENC_NA);
+ curr_offset += 16;
+ }
+ if (flags & 0x08000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_dst_ipv6_addr, tvb, curr_offset, 16, ENC_NA);
+ curr_offset += 16;
+ }
+ if (flags & 0x10000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_src_addr_prefix_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ }
+ if (flags & 0x20000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_dst_addr_prefix_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ }
+ if (flags & 0x40000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_ipsec_spi, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
+ curr_offset += 4;
+ }
+ if (flags & 0x80000000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_prot_type_nxt_hdr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ }
+ if (flags & 0x00010000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_start_src_port_range, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
+ curr_offset += 4;
+ }
+ if (flags & 0x00020000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_end_src_port_range, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
+ curr_offset += 4;
+ }
+ if (flags & 0x00040000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_start_dst_port_range, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
+ curr_offset += 4;
+ }
+ if (flags & 0x00080000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_end_dst_port_range, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
+ curr_offset += 4;
+ }
+ if (flags & 0x00100000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_tos, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ }
+ if (flags & 0x00200000) {
+ proto_tree_add_item(subtree, hf_nbifom_routing_rule_flow_label, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
+ curr_offset += 3;
+ }
+ }
+}
+
+static int
+dissect_nbifom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
+{
+ proto_item *item;
+ proto_tree *nbifom_tree, *subtree;
+ gint reported_len = tvb_reported_length(tvb);
+ gint offset = 0, saved_offset;
+ guint32 param_id, param_contents_len;
+ int hf_nbifom_param_id = pinfo->link_dir == P2P_DIR_UL ? hf_nbifom_param_id_ul : hf_nbifom_param_id_dl;
+
+ col_append_sep_str(pinfo->cinfo, COL_PROTOCOL, "/", "NBIFOM");
+
+ item = proto_tree_add_item(tree, proto_nbifom, tvb, 0, -1, ENC_NA);
+ nbifom_tree = proto_item_add_subtree(item, ett_nbifom);
+
+ while (offset < reported_len) {
+ item = proto_tree_add_item_ret_uint(nbifom_tree, hf_nbifom_param_id, tvb, offset, 1, ENC_BIG_ENDIAN, &param_id);
+ offset++;
+ subtree = proto_item_add_subtree(item, ett_nbifom_param_contents);
+ proto_tree_add_item_ret_uint(subtree, hf_nbifom_param_contents_len, tvb, offset, 1, ENC_BIG_ENDIAN, &param_contents_len);
+ offset++;
+ saved_offset = offset;
+ switch (param_id) {
+ case 1:
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_mode, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ break;
+ case 2:
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_dflt_access, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ break;
+ case 3:
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_status, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ break;
+ case 5:
+ if (pinfo->link_dir == P2P_DIR_DL) {
+ break;
+ } /* else fall through case 4 */
+ case 4:
+ dissect_nbifom_routing_rules(tvb, pinfo, subtree, offset, param_contents_len);
+ offset += param_contents_len;
+ break;
+ case 6:
+ if (pinfo->link_dir == P2P_DIR_DL) {
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_ran_rules_handling, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ }
+ break;
+ case 7:
+ if (pinfo->link_dir == P2P_DIR_UL) {
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_ran_rules_status, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ }
+ break;
+ case 8:
+ if (pinfo->link_dir == P2P_DIR_UL) {
+ static const int * flags[] = {
+ &hf_nbifom_param_contents_access_use_ind_spare,
+ &hf_nbifom_param_contents_access_use_ind_wlan_access_usable_val,
+ &hf_nbifom_param_contents_access_use_ind_3gpp_access_usable_val,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(subtree, tvb, offset, 1, flags, ENC_BIG_ENDIAN);
+ offset++;
+ }
+ break;
+ default:
+ break;
+ }
+ if ((offset - saved_offset) < (gint)param_contents_len) {
+ proto_tree_add_item(subtree, hf_nbifom_param_contents_rem_bytes, tvb, offset, param_contents_len - (offset - saved_offset), ENC_NA);
+ }
+ offset = saved_offset + param_contents_len;
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+void
+proto_register_nbifom(void)
+{
+ static hf_register_info hf[] = {
+ { &hf_nbifom_param_id_ul,
+ { "Parameter identifier", "nbifom.param_id", FT_UINT8, BASE_HEX,
+ VALS(nbifom_param_id_ue_to_nw_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_id_dl,
+ { "Parameter identifier", "nbifom.param_id", FT_UINT8, BASE_HEX,
+ VALS(nbifom_param_id_nw_to_ue_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_len,
+ { "Length of parameter contents", "nbifom.param_contents.len", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_dflt_access,
+ { "NBIFOM default access", "nbifom.param_contents.dflt_access", FT_UINT8, BASE_HEX,
+ VALS(nbifom_dflt_access_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_status,
+ { "NBIFOM status", "nbifom.param_contents.status", FT_UINT8, BASE_HEX,
+ VALS(nbifom_status_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_ran_rules_handling,
+ { "NBIFOM RAN rules handling", "nbifom.param_contents.ran_rules_handling", FT_UINT8, BASE_HEX,
+ VALS(nbifom_ran_rules_handling_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_ran_rules_status,
+ { "NBIFOM RAN rules status", "nbifom.param_contents.ran_rules_status", FT_UINT8, BASE_HEX,
+ VALS(nbifom_ran_rules_status_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_access_use_ind_spare,
+ { "Spare", "nbifom.param_contents.access_use_ind.spare", FT_UINT8, BASE_HEX,
+ NULL, 0xf0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_access_use_ind_wlan_access_usable_val,
+ { "WLAN access usable value", "nbifom.param_contents.access_use_ind.wlan_access_usable_val", FT_UINT8, BASE_HEX,
+ VALS(nbifom_wlan_access_usable_vals), 0x0c, NULL, HFILL }},
+ { &hf_nbifom_param_contents_access_use_ind_3gpp_access_usable_val,
+ { "3GPP access usable value", "nbifom.param_contents.access_use_ind.3gpp_access_usable_val", FT_UINT8, BASE_HEX,
+ VALS(nbifom_3gpp_access_usable_vals), 0x03, NULL, HFILL }},
+ { &hf_nbifom_param_contents_mode,
+ { "NBIFOM mode", "nbifom.param_contents.mode", FT_UINT8, BASE_HEX,
+ VALS(nbifom_mode_vals), 0, NULL, HFILL }},
+ { &hf_nbifom_param_contents_rem_bytes,
+ { "Remaining parameter contents", "nbifom.param_contents.rem_bytes", FT_BYTES, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_len,
+ { "Length of routing rule", "nbifom.routing_rule.len", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_id,
+ { "Routing rule identifier", "nbifom.routing_rule.id", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_routing_access,
+ { "Routing access", "nbifom.routing_rule.routing_access", FT_UINT8, BASE_DEC,
+ VALS(nbifom_routing_access_vals), 0xc0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_spare,
+ { "Spare", "nbifom.routing_rule.spare", FT_UINT8, BASE_HEX,
+ NULL, 0x38, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_op_code,
+ { "Operation code", "nbifom.routing_rule.op_code", FT_UINT8, BASE_HEX,
+ VALS(nbifom_op_code_vals), 0x07, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_prio,
+ { "Routing rule priority", "nbifom.routing_rule.prio", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags,
+ { "Flags", "nbifom.routing_rule.flags", FT_UINT32, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_prot_type_nxt_hdr,
+ { "Protocol type / next header", "nbifom.routing_rule.flags.prot_type_nxt_hdr", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x80000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_ipsec_spi,
+ { "IPSec SPI", "nbifom.routing_rule.flags.ipsec_spi", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x40000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_dst_addr_prefix_len,
+ { "Destination address prefix length", "nbifom.routing_rule.flags.dst_addr_prefix_len", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x20000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_src_addr_prefix_len,
+ { "Source address prefix length", "nbifom.routing_rule.flags.src_addr_prefix_len", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x10000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_dst_ipv6_addr,
+ { "Destination IPv6 address", "nbifom.routing_rule.flags.dst_ipv6_addr", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x08000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_src_ipv6_addr,
+ { "Source IPv6 address", "nbifom.routing_rule.flags.src_ipv6_addr", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x04000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_dst_ipv4_addr,
+ { "Destination IPv4 address", "nbifom.routing_rule.flags.dst_ipv4_addr", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x02000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_src_ipv4_addr,
+ { "Source IPv4 address", "nbifom.routing_rule.flags.src_ipv4_addr", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x01000000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_spare_bits0xc0,
+ { "Spare", "nbifom.routing_rule.flags.spare", FT_UINT32, BASE_HEX,
+ NULL, 0x00c00000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_flow_label,
+ { "Flow label", "nbifom.routing_rule.flags.flow_label", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00200000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_tos,
+ { "Type of service", "nbifom.routing_rule.flags.tos", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00100000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_end_dst_port_range,
+ { "End destination port range", "nbifom.routing_rule.flags.end_dst_port_range", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00080000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_start_dst_port_range,
+ { "Start destination port range", "nbifom.routing_rule.flags.start_dst_port_range", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00040000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_end_src_port_range,
+ { "End source port range", "nbifom.routing_rule.flags.end_src_port_range", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00020000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_start_src_port_range,
+ { "Start source port range", "nbifom.routing_rule.flags.start_src_port_rang", FT_BOOLEAN, 32,
+ TFS(&tfs_present_not_present), 0x00010000, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flags_spare_bits0xffff,
+ { "Spare", "nbifom.routing_rule.flags.spare", FT_UINT32, BASE_HEX,
+ NULL, 0x0000ffff, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_src_ipv4_addr,
+ { "Source IPv4 address", "nbifom.routing_rule.src_ipv4_addr", FT_IPv4, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_dst_ipv4_addr,
+ { "Destination IPv4 address", "nbifom.routing_rule.dst_ipv4_addr", FT_IPv4, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_src_ipv6_addr,
+ { "Source IPv6 address", "nbifom.routing_rule.src_ipv6_addr", FT_IPv6, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_dst_ipv6_addr,
+ { "Destination IPv6 address", "nbifom.routing_rule.dst_ipv6_addr", FT_IPv6, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_src_addr_prefix_len,
+ { "Source address prefix length", "nbifom.routing_rule.src_addr_prefix_len", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_dst_addr_prefix_len,
+ { "Destination address prefix length", "nbifom.routing_rule.dst_addr_prefix_len", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_ipsec_spi,
+ { "IPSec SPI", "nbifom.routing_rule.ipsec_spi", FT_UINT32, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_prot_type_nxt_hdr,
+ { "Protocol type / next header", "nbifom.routing_rule.prot_type_nxt_hdr", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_start_src_port_range,
+ { "Start source port range", "nbifom.routing_rule.start_src_port_range", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_end_src_port_range,
+ { "End source port range", "nbifom.routing_rule.end_src_port_range", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_start_dst_port_range,
+ { "Start destination port range", "nbifom.routing_rule.start_dst_port_range", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_end_dst_port_range,
+ { "End destination port range", "nbifom.routing_rule.end_dst_port_range", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_tos,
+ { "Type of service", "nbifom.routing_rule.tos", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_nbifom_routing_rule_flow_label,
+ { "Flow label", "nbifom.routing_rule.flow_label", FT_UINT24, BASE_HEX,
+ NULL, 0x0fffff, NULL, HFILL }}
+ };
+
+ static gint *nbifom_subtrees[] = {
+ &ett_nbifom,
+ &ett_nbifom_param_contents,
+ &ett_nbifom_routing_rule,
+ &ett_nbifom_routing_rule_flags
+ };
+
+ proto_nbifom = proto_register_protocol("Network-Based IP Flow Mobility", "NBIFOM", "nbifom");
+ proto_register_field_array(proto_nbifom, hf, array_length(hf));
+ proto_register_subtree_array(nbifom_subtrees, array_length(nbifom_subtrees));
+
+ register_dissector("nbifom", dissect_nbifom, proto_nbifom);
+}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */