/* packet-gtpv2.c
*
* Routines for GTPv2 dissection
- * Copyright 2009 - 2015, Anders Broman <anders.broman [at] ericsson.com>
+ * Copyright 2009 - 2016, Anders Broman <anders.broman [at] ericsson.com>
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
static int hf_gtpv2_csfbi = -1;
static int hf_gtpv2_clii = -1;
static int hf_gtpv2_cpsr = -1;
+static int hf_gtpv2_nsi = -1;
+static int hf_gtpv2_uasi = -1;
+static int hf_gtpv2_dtci = -1;
+static int hf_gtpv2_bdwi = -1;
+static int hf_gtpv2_psci = -1;
static int hf_gtpv2_pcri = -1;
static int hf_gtpv2_aosi = -1;
static int hf_gtpv2_aopi = -1;
+static int hf_gtpv2_roaai = -1;
+static int hf_gtpv2_epcosi = -1;
+static int hf_gtpv2_cpopci = -1;
+static int hf_gtpv2_pmtsmi = -1;
+static int hf_gtpv2_s11tf = -1;
+static int hf_gtpv2_pnsi = -1;
+static int hf_gtpv2_unaccsi = -1;
+static int hf_gtpv2_wpmsi = -1;
+static int hf_gtpv2_enbcrsi = -1;
+static int hf_gtpv2_tspcmi = -1;
static int hf_gtpv2_pdn_type = -1;
static int hf_gtpv2_ti = -1;
-static int hf_gtpv2_bearer_qos_pvi= -1;
-static int hf_gtpv2_bearer_qos_pl= -1;
static int hf_gtpv2_bearer_qos_pci= -1;
+static int hf_gtpv2_bearer_qos_pl= -1;
+static int hf_gtpv2_bearer_qos_pvi= -1;
static int hf_gtpv2_bearer_qos_label_qci = -1;
static int hf_gtpv2_bearer_qos_mbr_up = -1;
static int hf_gtpv2_bearer_qos_mbr_down = -1;
static int hf_gtpv2_uli_timestamp = -1;
static int hf_gtpv2_mbms_session_duration_days = -1;
static int hf_gtpv2_mbms_session_duration_secs = -1;
+static int hf_gtpv2_csg_id = -1;
+static int hf_gtpv2_cmi = -1;
+static int hf_gtpv2_service_indicator = -1;
+static int hf_gtpv2_detach_type = -1;
+static int hf_gtpv2_ldn = -1;
static int hf_gtpv2_node_features_prn = -1;
static int hf_gtpv2_node_features_mabr =-1;
static int hf_gtpv2_node_features_ntsr = -1;
static int hf_gtpv2_twan_relay_id_ipv6 = -1;
static int hf_gtpv2_twan_circuit_id_len = -1;
static int hf_gtpv2_twan_circuit_id = -1;
+static int hf_gtpv2_integer_number_val = -1;
static gint ett_gtpv2 = -1;
static gint ett_gtpv2_flags = -1;
static expert_field ei_gtpv2_mbms_session_duration_days = EI_INIT;
static expert_field ei_gtpv2_mbms_session_duration_secs = EI_INIT;
static expert_field ei_gtpv2_ie = EI_INIT;
+static expert_field ei_gtpv2_int_size_not_handled = EI_INIT;
/* Definition of User Location Info (AVP 22) masks */
{ 35, "Modify Bearer Response"},
{ 36, "Delete Session Request"},
{ 37, "Delete Session Response"},
- /* SGSN to PGW (S4, S5/S8) */
+ /* SGSN/MME to PGW (S4/S11, S5/S8) */
{ 38, "Change Notification Request"},
{ 39, "Change Notification Response"},
- /* 40-63 For future use */
+ /* MME to PGW (S11, S5/S8) */
+ { 40, "Remote UE Report Notification" },
+ { 41, "Remote UE Report Acknowledge" },
+ /* 42-63 For future use */
/* Messages without explicit response */
{ 64, "Modify Bearer Command"}, /* (MME/SGSN to PGW -S11/S4, S5/S8) */
{ 65, "Modify Bearer Failure Indication"}, /*(PGW to MME/SGSN -S5/S8, S11/S4) */
{ 72, "Trace Session Deactivation"},
{ 73, "Stop Paging Indication"},
/* 74-94 For future use */
- /* PDN-GW to SGSN/MME (S5/S8, S4/S11) */
+ /* PGW to SGSN/MME/ TWAN/ePDG (S5/S8, S4/S11, S2a, S2b) */
{ 95, "Create Bearer Request"},
{ 96, "Create Bearer Response"},
{ 97, "Update Bearer Request"},
/* PGW to MME, MME to PGW, SGW to PGW, SGW to MME (S5/S8, S11) */
{101, "Delete PDN Connection Set Request"},
{102, "Delete PDN Connection Set Response"},
- /* 103-127 For future use */
+ /* PGW to SGSN/MME(S5, S4/S11) */
+ {103, "PGW Downlink Triggering Notification" },
+ {104, "PGW Downlink Triggering Acknowledge" },
+ /* 105-127 For future use */
/* MME to MME, SGSN to MME, MME to SGSN, SGSN to SGSN (S3/10/S16) */
{128, "Identification Request"},
{129, "Identification Response"},
{153, "Alert MME Notification"},
{154, "Alert MME Acknowledge"},
{155, "UE Activity Notification"},
- {156, "UE Activity Acknowledge"},
- /* 157 to 159 For future use */
+ {156, "UE Activity Acknowledge" },
+ {157, "ISR Status Indication" },
+ {158, "UE Registration Query Request" },
+ {159, "UE Registration Query Response" },
/* MME to SGW (S11) */
{160, "Create Forwarding Tunnel Request"},
{161, "Create Forwarding Tunnel Response"},
{235, "MBMS Session Stop Request"},
{236, "MBMS Session Stop Response"},
/* 237 to 239 For future use */
+ /* Reserved for Sv interface (see also types 25 to 31) TS 29.280 */
{240, "SRVCC CS to PS Response"}, /* 5.2.9 3GPP TS 29.280 V11.5.0 (2013-09) */
{241, "SRVCC CS to PS Complete Notification"}, /* 5.2.10 3GPP TS 29.280 V11.5.0 (2013-09) */
{242, "SRVCC CS to PS Complete Acknowledge"}, /* 5.2.11 3GPP TS 29.280 V11.5.0 (2013-09) */
#define GTPV2_IE_TRUST_WLAN_MODE_IND 174
#define GTPV2_IE_NODE_NUMBER 175
#define GTPV2_IE_NODE_IDENTIFIER 176
-#define GTPV2_IE_PRES_REP_AREA_ACT 177
-#define GTPV2_IE_PRES_REP_AREA_INF 178
+#define GTPV2_IE_PRES_REP_AREA_ACT 177
+#define GTPV2_IE_PRES_REP_AREA_INF 178
#define GTPV2_IE_TWAN_ID_TS 179
#define GTPV2_IE_OVERLOAD_CONTROL_INF 180
#define GTPV2_IE_LOAD_CONTROL_INF 181
#define GTPV2_IE_APN_AND_REL_CAP 184
/* 185: WLAN Offloadability Indication*/
#define GTPV2_IE_PAGING_AND_SERVICE_INF 186
+#define GTPV2_IE_INTEGER_NUMBER 187
+/*
+188 Millisecond Time Stamp
+189 Monitoring Event Information
+190 ECGI List
+191 Remote UE Context
+192 Remote User ID
+193 Remote UE IP information
+194 CIoT Optimizations Support Indication
+195 SCEF PDN Connection
+196 Header Compression Configuration
+197 Extended Protocol Configuration Options (ePCO)
+198 Serving PLMN Rate Control
+199 Counter
+200 to 253 Spare. For future use.
+254 Special IE type for IE Type Extension
+255 Private Extension
+256 to 65535 Spare. For future use.
+*/
/* 169 to 254 reserved for future use */
#define GTPV2_IE_PRIVATE_EXT 255
{ 1, "International Mobile Subscriber Identity (IMSI)"}, /* Variable Length / 8.3 */
{ 2, "Cause"}, /* Variable Length / 8.4 */
{ 3, "Recovery (Restart Counter)"}, /* Variable Length / 8.5 */
- /* 4-34 Reserved for S101 interface Extendable / See 3GPP TS 29.276 [14] */
/* 4-34 Reserved for S101 interface Extendable / See 3GPP TS 29.276 [14] */
/* 35-50 / See 3GPP TS 29.276 */
/*Start SRVCC Messages ETSI TS 129 280 V10.1.0 (2011-06) 6.1*/
{196, "Header Compression Configuration"}, /* Extendable / 8.127 */
{197, "Extended Protocol Configuration Options(ePCO)"}, /* Variable Length / 8.128 */
{198, "Serving PLMN Rate Control"}, /* Extendable / 8.129 */
- /* 199 to 254 Spare. For future use. */
-
+ {199, "Counter" }, /* Extendable / 8.130 */
+ /* 1200 to 254 Spare. For future use. */
{255, "Private Extension"}, /* Variable Length / 8.67 */
{0, NULL}
};
return;
}
- /* Octet 9 Spare Spare Spare Spare Spare PCRI AOSI AOPI */
+ /* Octet 9 NSI UASI DTCI BDWI PSCI PCRI AOSI AOPI */
+ proto_tree_add_item(tree, hf_gtpv2_nsi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_uasi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_dtci, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_bdwi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_psci, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gtpv2_pcri, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gtpv2_aosi, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gtpv2_aopi, tvb, offset, 1, ENC_BIG_ENDIAN);
return;
}
+ /* Octet 10 ROAAI EPCOSI CPOPCI PMTSMI S11TF PNSI UNACCSI WPMSI */
+ proto_tree_add_item(tree, hf_gtpv2_roaai, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_epcosi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_cpopci, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_pmtsmi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_s11tf, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_pnsi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_unaccsi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_wpmsi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+
+ if (length == 6){
+ return;
+ }
+
+ /*Octet 11 Spare Spare Spare Spare Spare Spare ENBCRSI TSPCMI */
+ proto_tree_add_item(tree, hf_gtpv2_enbcrsi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_tspcmi, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+
+ if (length == 7){
+ return;
+ }
+
proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet");
{1, "IPv4"},
{2, "IPv6"},
{3, "IPv4/IPv6"},
+ {4, "Non-IP"},
{0, NULL}
};
dissect_gtpv2_bearer_qos(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
int offset = 0;
- proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pvi, tvb, offset, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pl, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pci, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pl, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pvi, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_gtpv2_bearer_qos_label_qci, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
{5, "HSPA Evolution"},
{6, "EUTRAN"},
{7, "Virtual"},
+ {8, "EUTRAN-NB-IoT"},
{0, NULL}
};
static value_string_ext gtpv2_rat_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_rat_type_vals);
* It can be found in 3GPP TS 36.413 v8.3.0, but it is expected that it will be moved
* to 23.003 in a future version.
*/
-static gchar*
+gchar*
dissect_gtpv2_tai(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
{
gchar *str = NULL;
gchar *mcc_mnc_str;
guint16 tac;
- mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_NONE, TRUE);
+ mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_TAI, TRUE);
*offset += 3;
tac = tvb_get_ntohs(tvb, *offset);
proto_tree_add_item(tree, hf_gtpv2_tai_tac, tvb, *offset, 2, ENC_BIG_ENDIAN);
NULL
};
- mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_NONE, TRUE);
+ mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_ECGI, TRUE);
*offset += 3;
/* The bits 8 through 5, of octet e+3 (Fig 8.21.5-1 in TS 29.274 V8.2.0) are spare
* and hence they would not make any difference to the hex string following it,
gchar *mcc_mnc_str;
guint16 lac, ci;
- mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_NONE, TRUE);
+ mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_CGI, TRUE);
*offset += 3;
lac = tvb_get_ntohs(tvb, *offset);
proto_tree_add_item(tree, hf_gtpv2_uli_cgi_lac, tvb, *offset, 2, ENC_BIG_ENDIAN);
{35, "S2a TWAN GTP-C interface"},
{36, "S2a PGW GTP-C interface"},
{37, "S2a PGW GTP-U interface"},
+ {38, "S11 MME GTP-U interface"},
+ {39, "S11 SGW GTP-U interface"},
{0, NULL}
};
static value_string_ext gtpv2_f_teid_interface_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_f_teid_interface_type_vals);
{
proto_tree *auth_qui_tree;
int i;
- guint8 xres_len, autn_len;
+ guint32 tmp;
for (i = 0; i < nr_qui; i++) {
auth_qui_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
*/
proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_rand, tvb, offset, 16, ENC_NA);
offset += 16;
- xres_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_xres_len, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_uint(auth_qui_tree, hf_gtpv2_mm_context_xres_len, tvb, offset, 1, ENC_NA, &tmp);
offset += 1;
- proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_xres, tvb, offset, xres_len, ENC_NA);
- offset += xres_len;
+ proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_xres, tvb, offset, tmp, ENC_NA);
+ offset += tmp;
proto_tree_add_item(auth_qui_tree, hf_gtpv2_ck, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(auth_qui_tree, hf_gtpv2_ik, tvb, offset, 16, ENC_NA);
offset += 16;
- autn_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_autn_len, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_uint(auth_qui_tree, hf_gtpv2_mm_context_autn_len, tvb, offset, 1, ENC_NA, &tmp);
offset += 1;
- proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_autn, tvb, offset, autn_len, ENC_NA);
- offset += autn_len;
+ proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_autn, tvb, offset, tmp, ENC_NA);
+ offset += tmp;
}
return offset;
dissect_gtpv2_authentication_quadruplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 nr_qui)
{
proto_tree *auth_qua_tree;
- guint8 tmp;
+ guint32 tmp;
int i;
for (i = 0; i < nr_qui; i++) {
- auth_qua_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
- ett_gtpv2_mm_context_auth_qua, NULL, "Authentication Quadruplet");
+ auth_qua_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
+ ett_gtpv2_mm_context_auth_qua, NULL, "Authentication Quadruplet %u",i+1);
proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_rand, tvb, offset, 16, ENC_NA);
offset += 16;
- tmp = tvb_get_guint8(tvb, offset++);
+ proto_tree_add_item_ret_uint(auth_qua_tree, hf_gtpv2_mm_context_xres_len, tvb, offset, 1, ENC_NA, &tmp);
+ offset++;
proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_xres, tvb, offset, tmp, ENC_NA);
offset += tmp;
- tmp = tvb_get_guint8(tvb, offset++);
+ proto_tree_add_item_ret_uint(auth_qua_tree, hf_gtpv2_mm_context_autn_len, tvb, offset, 1, ENC_NA, &tmp);
+ offset++;
proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_autn, tvb, offset, tmp, ENC_NA);
offset += tmp;
{
proto_tree *net_cap_tree, *msnt_cap_tree;
guint8 ue_net_cap_len, ms_net_cap_len, mei_len;
- guint32 tmp;
/*
* If SAMBRI (Subscribed UE AMBR Indicator), bit 1 of octet 6, is set to "1",
*/
if (samb_ri) {
/* j to (j+3) Uplink Subscribed UE AMBR */
- tmp = tvb_get_ntohl(tvb, offset);
- proto_tree_add_uint_format_value(tree, hf_gtpv2_uplink_subscribed_ue_ambr, tvb, offset, 4, tmp, "%d Kbps", tmp);
+ proto_tree_add_item(tree, hf_gtpv2_uplink_subscribed_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
/* (j+4) to (j+7) Downlink Subscribed UE AMBR */
- tmp = tvb_get_ntohl(tvb, offset);
- proto_tree_add_uint_format_value(tree, hf_gtpv2_downlink_subscribed_ue_ambr, tvb, offset, 4, tmp, "%d Kbps", tmp);
+ proto_tree_add_item(tree, hf_gtpv2_downlink_subscribed_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
*/
if (uamb_ri) {
/* i to (i+3) Uplink Used UE AMBR */
- tmp = tvb_get_ntohl(tvb, offset);
- proto_tree_add_uint_format_value(tree, hf_gtpv2_uplink_used_ue_ambr, tvb, offset, 4, tmp, "%d Kbps", tmp);
+ proto_tree_add_item(tree, hf_gtpv2_uplink_used_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
/* (i+4) to (i+7) Downlink Used UE AMBR */
- tmp = tvb_get_ntohl(tvb, offset);
- proto_tree_add_uint_format_value(tree, hf_gtpv2_downlink_used_ue_ambr, tvb, offset, 4, tmp, "%d Kbps", tmp);
+ proto_tree_add_item(tree, hf_gtpv2_downlink_used_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
* Hop Chaining Count) are both present, otherwise their octets are not present.
*/
tmp = tvb_get_guint8(tvb, offset);
- osci = tmp & 1;
nhi = (tmp & 0x10) >> 4;
drxi = (tmp & 0x08) >> 3;
proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_drxi, tvb, offset, 1, ENC_BIG_ENDIAN);
nr_qua = tmp & 0x1c;
nr_qua >>= 2;
uamb_ri = (tmp & 0x2) >> 1;
+ osci = tmp & 1;
proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_nr_qui, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_nr_qua, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gtpv2_mm_context_old_kasme, tvb, offset, 32, ENC_NA);
offset += 32;
/* (s+33) to (s+64) old NH */
- if ((dword & 1) == 1) {
+ if (dword) {
proto_tree_add_item(tree, hf_gtpv2_mm_context_old_nh, tvb, offset, 32, ENC_NA);
offset += 32;
}
if (paging_len) {
proto_tree_add_item(tree, hf_gtpv2_ue_radio_capability_for_paging_information, tvb, offset, paging_len, ENC_NA);
- offset = +paging_len;
+ offset +=paging_len;
}
if (offset < (gint)length){
- proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet");
+ proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, length - offset, "The rest of the IE not dissected yet");
}
}
/* 8.78 CSG ID */
static void
-dissect_gtpv2_csg_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+dissect_gtpv2_csg_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
- proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
+ proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, 0, 5, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_csg_id, tvb, 0, 4, ENC_BIG_ENDIAN);
+ if (length > 1) {
+ proto_tree_add_item(tree, hf_gtpv2_spare_bytes, tvb, 1, length-1, ENC_NA);
+ }
}
/* 8.79 CSG Membership Indication (CMI) */
static void
-dissect_gtpv2_cmi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+dissect_gtpv2_cmi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
- proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
+ proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, 0, 7, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gtpv2_cmi, tvb, 0, 1, ENC_BIG_ENDIAN);
+ if (length > 1) {
+ proto_tree_add_item(tree, hf_gtpv2_spare_bytes, tvb, 1, length-1, ENC_NA);
+ }
}
/* 8.80 Service indicator */
+static const value_string gtpv2_service_indicator_vals[] = {
+ { 1, "CS call indicator" },
+ { 2, "SMS indicator" },
+ { 0, NULL }
+};
+
static void
-dissect_gtpv2_service_indicator(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+dissect_gtpv2_service_indicator(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
- proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
+ proto_tree_add_item(tree, hf_gtpv2_service_indicator, tvb, 0, 1, ENC_BIG_ENDIAN);
}
/* 8.81 Detach Type */
+static const value_string gtpv2_detach_type_vals[] = {
+ { 1, "PS Detach" },
+ { 2, "Combined PS/CS Detach" },
+ { 0, NULL }
+};
+
static void
-dissect_gtpv2_detach_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+dissect_gtpv2_detach_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
- proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
+ proto_tree_add_item(tree, hf_gtpv2_detach_type, tvb, 0, 1, ENC_BIG_ENDIAN);
}
/* 8.82 Local Distinguished Name (LDN) */
static void
-dissect_gtpv2_ldn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+dissect_gtpv2_ldn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
{
- proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
+ proto_tree_add_item(tree, hf_gtpv2_ldn, tvb, 0, length, ENC_ASCII|ENC_NA);
}
/* 8.83 Node Features */
proto_tree_add_item(tree, hf_gtpv2_ppi_value, tvb, offset, 1, ENC_BIG_ENDIAN);
}
}
+/*
+ * 8.118 Integer Number
+ */
+static void
+dissect_gtpv2_integer_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
+{
+ int offset = 0;
+ /* The Integer Number value shall be encoded as further described below for the following information elements:
+ * Maximum Wait Time IE: the length shall be set to 2, i.e. the integer number value shall be encoded as a 16 bit unsigned integer.
+ * DL Buffering Suggested Packet Count IE: the length shall be set to 1 or 2;
+ * UE Usage Type IE: the length shall be set to 1, i.e. the integer number value shall be encoded as a 8 bit unsigned integer as specified in subclause 7.3.202 of 3GPP TS 29.272 [70].
+ */
+ if (length <= 4) {
+ /* Only handle up to 32 bits for now */
+ proto_tree_add_item(tree, hf_gtpv2_integer_number_val, tvb, offset, length, ENC_BIG_ENDIAN);
+ } else {
+ /* value not handled, yet*/
+ proto_tree_add_expert(tree, pinfo, &ei_gtpv2_int_size_not_handled, tvb, offset, length);
+
+ }
+
+}
typedef struct _gtpv2_ie {
int ie_type;
/* 185, 8.116 WLAN Offloadability Indication */
{GTPV2_IE_PAGING_AND_SERVICE_INF, dissect_gtpv2_paging_and_service_inf}, /* 186, 8.117 Paging and Service Information */
- /* 187, 8.118 Integer Number */
+ { GTPV2_IE_INTEGER_NUMBER, dissect_gtpv2_integer_number }, /* 187, 8.118 Integer Number */
/* 188, 8.119 Millisecond Time Stamp */
/* 189, 8.120 Monitoring Event Information */
/* 190, 8.121 ECGI List */
FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
},
{&hf_gtpv2_cpsr,
- {"CPSR (CS to PS SRVCC indication)", "gtpv2.cpsr",
+ {"CPSR (CS to PS SRVCC Indication)", "gtpv2.cpsr",
FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
},
+ {&hf_gtpv2_nsi,
+ {"NSI (NBIFOM Support Indication)", "gtpv2.nsi",
+ FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
+ },
+ {&hf_gtpv2_uasi,
+ {"UASI (UE Available for Signalling Indication)", "gtpv2.uasi",
+ FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
+ },
+ {&hf_gtpv2_dtci,
+ {"DTCI (Delay Tolerant Connection Indication)", "gtpv2.dtci",
+ FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
+ },
+ {&hf_gtpv2_bdwi,
+ {"BDWI (Buffered DL Data Waiting Indication)", "gtpv2.bdwi",
+ FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
+ },
+ {&hf_gtpv2_psci,
+ {"PSCI (Pending Subscription Change Indication)", "gtpv2.psci",
+ FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}
+ },
{&hf_gtpv2_pcri,
{"PCRI (P-CSCF Restoration Indication)", "gtpv2.pcri",
FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}
{"AOPI (Associate OCI with PGW node's Identity)", "gtpv2.aopi",
FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
},
+ {&hf_gtpv2_roaai,
+ {"ROAAI (Release Over Any Access Indication)", "gtpv2.roaai",
+ FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
+ },
+ {&hf_gtpv2_epcosi,
+ {"EPCOSI (Extended PCO Support Indication)", "gtpv2.epcosi",
+ FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
+ },
+ {&hf_gtpv2_cpopci,
+ {"CPOPCI (Control Plane Only PDN Connection Indication)", "gtpv2.cpopci",
+ FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
+ },
+ {&hf_gtpv2_pmtsmi,
+ {"PMTSMI (Pending MT Short Message Indication)", "gtpv2.pmtsmi",
+ FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
+ },
+ {&hf_gtpv2_s11tf,
+ {"S11TF (S11-U Tunnel Flag)", "gtpv2.s11tf",
+ FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}
+ },
+ {&hf_gtpv2_pnsi,
+ {"PNSI (Pending Network Initiated PDN Connection Signalling Indication)", "gtpv2.pnsi",
+ FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}
+ },
+ {&hf_gtpv2_unaccsi,
+ {"UNACCSI (UE Not Authorized Cause Code Support Indication)", "gtpv2.unaccsi",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
+ },
+ {&hf_gtpv2_wpmsi,
+ {"WPMSI (WLCP PDN Connection Modification Support Indication)", "gtpv2.wpmsi",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
+ },
+ {&hf_gtpv2_enbcrsi,
+ {"ENBCRSI (eNB Change Reporting Support Indication)", "gtpv2.enbcrsi",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
+ },
+ {&hf_gtpv2_tspcmi,
+ {"TSPCMI (Triggering SGSN Initiated PDP Context Creation/Modification Indication)", "gtpv2.tspcmi",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
+ },
{ &hf_gtpv2_pdn_type,
{"PDN Type", "gtpv2.pdn_type",
FT_UINT8, BASE_DEC, VALS(gtpv2_pdn_type_vals), 0x07,
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
- /* Bit 1 - PVI (Pre-emption Vulnerability): See 3GPP TS 29.212[29],
- * clause 5.3.47 Pre-emption-Vulnerability AVP.
- * 5.3.47 Pre-emption-Vulnerability AVP
+ /* Bit 7 - PCI (Pre-emption Capability): See 3GPP TS 29.212[29], clause 5.3.46 Pre-emption-Capability AVP.
+ * clause 5.3.46 Pre-emption-Capability AVP.
+ * 5.3.46 Pre-emption-Capability AVP
* The following values are defined:
- * PRE-EMPTION_VULNERABILITY_ENABLED (0)
- * PRE-EMPTION_VULNERABILITY_DISABLED (1)
+ * PRE-EMPTION_CAPABILITY_ENABLED (0)
+ * PRE-EMPTION_CAPABILITY_DISABLED (1)
*/
- {&hf_gtpv2_bearer_qos_pvi,
- {"PVI (Pre-emption Vulnerability)", "gtpv2.bearer_qos_pvi",
- FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x01,
+ {&hf_gtpv2_bearer_qos_pci,
+ {"PCI (Pre-emption Capability)", "gtpv2.bearer_qos_pci",
+ FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x40,
NULL, HFILL}
},
{&hf_gtpv2_bearer_qos_pl,
FT_UINT8, BASE_DEC, NULL, 0x3c,
NULL, HFILL}
},
- /* Bit 7 - PCI (Pre-emption Capability): See 3GPP TS 29.212[29], clause 5.3.46 Pre-emption-Capability AVP.
- * clause 5.3.46 Pre-emption-Capability AVP.
- * 5.3.46 Pre-emption-Capability AVP
+ /* Bit 1 - PVI (Pre-emption Vulnerability): See 3GPP TS 29.212[29],
+ * clause 5.3.47 Pre-emption-Vulnerability AVP.
+ * 5.3.47 Pre-emption-Vulnerability AVP
* The following values are defined:
- * PRE-EMPTION_CAPABILITY_ENABLED (0)
- * PRE-EMPTION_CAPABILITY_DISABLED (1)
+ * PRE-EMPTION_VULNERABILITY_ENABLED (0)
+ * PRE-EMPTION_VULNERABILITY_DISABLED (1)
*/
- {&hf_gtpv2_bearer_qos_pci,
- {"PCI (Pre-emption Capability)", "gtpv2.bearer_qos_pci",
- FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x40,
+ {&hf_gtpv2_bearer_qos_pvi,
+ {"PVI (Pre-emption Vulnerability)", "gtpv2.bearer_qos_pvi",
+ FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x01,
NULL, HFILL}
},
{&hf_gtpv2_bearer_qos_label_qci,
},
{ &hf_gtpv2_mm_context_osci,
{"OSCI", "gtpv2.mm_context_osci",
- FT_BOOLEAN, 8, NULL, 0x02,
- NULL, HFILL}
+ FT_BOOLEAN, 8, NULL, 0x01,
+ "Old Security Context Indicator", HFILL}
},
{ &hf_gtpv2_mm_context_samb_ri,
{"SAMB RI", "gtpv2.mm_context_samb_ri",
FT_UINT24, BASE_DEC, NULL, 0xFFFF80,
NULL, HFILL}
},
+ { &hf_gtpv2_csg_id,
+ {"CSG ID", "gtpv2.csg_id",
+ FT_UINT32, BASE_HEX, NULL, 0x07ffffff,
+ NULL, HFILL}
+ },
+ { &hf_gtpv2_cmi,
+ {"CSG Membership Indication (CMI)", "gtpv2.cmi",
+ FT_BOOLEAN, 8, TFS(&tfs_no_yes), 0x01,
+ NULL, HFILL}
+ },
+ { &hf_gtpv2_service_indicator,
+ {"Service Indicator", "gtpv2.service_indicator",
+ FT_UINT8, BASE_DEC, VALS(gtpv2_service_indicator_vals), 0,
+ NULL, HFILL}
+ },
+ { &hf_gtpv2_detach_type,
+ {"Detach Type", "gtpv2.detach_type",
+ FT_UINT8, BASE_DEC, VALS(gtpv2_detach_type_vals), 0,
+ NULL, HFILL}
+ },
+ { &hf_gtpv2_ldn,
+ {"Local Distinguished Name (LDN)", "gtpv2.ldn",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL}
+ },
{ &hf_gtpv2_node_features_prn,
{"PGW Restart Notification (PRN)", "gtpv2.node_features_prn",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
{ &hf_gtpv2_drx_parameter, { "DRX parameter", "gtpv2.drx_parameter", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_gtpv2_mm_context_sres, { "SRES'", "gtpv2.mm_context_sres", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_gtpv2_mm_context_kc, { "Kc'", "gtpv2.mm_context_kc", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
- { &hf_gtpv2_uplink_subscribed_ue_ambr, { "Uplink Subscribed UE AMBR", "gtpv2.uplink_subscribed_ue_ambr", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
- { &hf_gtpv2_downlink_subscribed_ue_ambr, { "Downlink Subscribed UE AMBR", "gtpv2.downlink_subscribed_ue_ambr", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
- { &hf_gtpv2_uplink_used_ue_ambr, { "Uplink Used UE AMBR", "gtpv2.uplink_used_ue_ambr", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
- { &hf_gtpv2_downlink_used_ue_ambr, { "Downlink Used UE AMBR", "gtpv2.downlink_used_ue_ambr", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_gtpv2_uplink_subscribed_ue_ambr, { "Uplink Subscribed UE AMBR", "gtpv2.uplink_subscribed_ue_ambr", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_kbps, 0x0, NULL, HFILL }},
+ { &hf_gtpv2_downlink_subscribed_ue_ambr, { "Downlink Subscribed UE AMBR", "gtpv2.downlink_subscribed_ue_ambr", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_kbps, 0x0, NULL, HFILL }},
+ { &hf_gtpv2_uplink_used_ue_ambr, { "Uplink Used UE AMBR", "gtpv2.uplink_used_ue_ambr", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_kbps, 0x0, NULL, HFILL }},
+ { &hf_gtpv2_downlink_used_ue_ambr, { "Downlink Used UE AMBR", "gtpv2.downlink_used_ue_ambr", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_kbps, 0x0, NULL, HFILL }},
{ &hf_gtpv2_voice_domain_and_ue_usage_setting, { "Voice Domain Preference and UE's Usage Setting", "gtpv2.voice_domain_and_ue_usage_setting", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_gtpv2_ue_radio_capability_for_paging_information,{ "UE Radio Capability for Paging information", "gtpv2.UE_Radio_Capability_for_Paging_information", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
{ &hf_gtpv2_authentication_quadruplets, { "Authentication Quadruplets", "gtpv2.authentication_quadruplets", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_gtpv2_twan_relay_id_ipv6,{ "Relay Identity", "gtpv2.twan_id.relay_id_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } },
{ &hf_gtpv2_twan_circuit_id_len,{ "Relay Identity Type Length", "gtpv2.twan_id.relay_id_type_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
{ &hf_gtpv2_twan_circuit_id,{ "Circuit-ID", "gtpv2.twan_id.circuit_id", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_gtpv2_integer_number_val,{ "Value", "gtpv2.integer_number_val", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
};
static gint *ett_gtpv2_array[] = {
{ &ei_gtpv2_mbms_session_duration_days, { "gtpv2.mbms_session_duration_days.invalid", PI_PROTOCOL, PI_WARN, "Days out of allowed range", EXPFILL }},
{ &ei_gtpv2_mbms_session_duration_secs, { "gtpv2.mbms_session_duration_secs.unknown", PI_PROTOCOL, PI_WARN, "Seconds out of allowed range", EXPFILL }},
{ &ei_gtpv2_ie, { "gtpv2.ie_type.reserved", PI_PROTOCOL, PI_WARN, "IE type Zero is Reserved and should not be used", EXPFILL }},
+ { &ei_gtpv2_int_size_not_handled,{ "gtpv2.ie_type.int_size_not_handled", PI_PROTOCOL, PI_WARN, "Integer size not handled yet", EXPFILL } },
};
expert_module_t* expert_gtpv2;
register_dissector("gtpv2", dissect_gtpv2, proto_gtpv2);
/* Dissector table for private extensions */
- gtpv2_priv_ext_dissector_table = register_dissector_table("gtpv2.priv_ext", "GTPv2 PRIVATE EXT", proto_gtpv2, FT_UINT16, BASE_DEC, DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE);
+ gtpv2_priv_ext_dissector_table = register_dissector_table("gtpv2.priv_ext", "GTPv2 PRIVATE EXT", proto_gtpv2, FT_UINT16, BASE_DEC);
}
void