aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/ngap/packet-ngap-template.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/asn1/ngap/packet-ngap-template.c')
-rw-r--r--epan/dissectors/asn1/ngap/packet-ngap-template.c166
1 files changed, 164 insertions, 2 deletions
diff --git a/epan/dissectors/asn1/ngap/packet-ngap-template.c b/epan/dissectors/asn1/ngap/packet-ngap-template.c
index 1c91c199a8..d041968cf9 100644
--- a/epan/dissectors/asn1/ngap/packet-ngap-template.c
+++ b/epan/dissectors/asn1/ngap/packet-ngap-template.c
@@ -8,7 +8,7 @@
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
- * References: 3GPP TS 38.413 v15.6.0 (2019-12)
+ * References: 3GPP TS 38.413 v16.2.0 (2020-07)
*/
#include "config.h"
@@ -31,6 +31,7 @@
#include "packet-e212.h"
#include "packet-s1ap.h"
#include "packet-ranap.h"
+#include "packet-rrc.h"
#include "packet-lte-rrc.h"
#include "packet-nr-rrc.h"
#include "packet-gsm_map.h"
@@ -56,6 +57,8 @@ static dissector_handle_t nas_5gs_handle;
static dissector_handle_t nr_rrc_ue_radio_paging_info_handle;
static dissector_handle_t nr_rrc_ue_radio_access_cap_info_handle;
static dissector_handle_t lte_rrc_ue_radio_paging_info_handle;
+static dissector_handle_t lte_rrc_ue_radio_access_cap_info_handle;
+static dissector_handle_t lte_rrc_ue_radio_paging_info_nb_handle;
static dissector_handle_t nrppa_handle;
static int proto_json = -1;
@@ -78,6 +81,7 @@ static int hf_ngap_InterfacesToTrace_E1 = -1;
static int hf_ngap_InterfacesToTrace_reserved = -1;
static int hf_ngap_RATRestrictionInformation_e_UTRA = -1;
static int hf_ngap_RATRestrictionInformation_nR = -1;
+static int hf_ngap_RATRestrictionInformation_nR_unlicensed = -1;
static int hf_ngap_RATRestrictionInformation_reserved = -1;
static int hf_ngap_NrencyptionAlgorithms_nea1 = -1;
static int hf_ngap_NrencyptionAlgorithms_nea2 = -1;
@@ -95,6 +99,16 @@ static int hf_ngap_EUTRAintegrityProtectionAlgorithms_eia1 = -1;
static int hf_ngap_EUTRAintegrityProtectionAlgorithms_eia2 = -1;
static int hf_ngap_EUTRAintegrityProtectionAlgorithms_eia3 = -1;
static int hf_ngap_EUTRAintegrityProtectionAlgorithms_reserved = -1;
+static int hf_ngap_MeasurementsToActivate_M1 = -1;
+static int hf_ngap_MeasurementsToActivate_M2 = -1;
+static int hf_ngap_MeasurementsToActivate_M4 = -1;
+static int hf_ngap_MeasurementsToActivate_M5 = -1;
+static int hf_ngap_MeasurementsToActivate_M6 = -1;
+static int hf_ngap_MeasurementsToActivate_M7 = -1;
+static int hf_ngap_MeasurementsToActivate_M1_from_event = -1;
+static int hf_ngap_MeasurementsToActivate_reserved = -1;
+static int hf_ngap_MDT_Location_Information_GNSS = -1;
+static int hf_ngap_MDT_Location_Information_reserved = -1;
#include "packet-ngap-hf.c"
/* Initialize the subtree pointers */
@@ -124,6 +138,16 @@ static gint ett_ngap_NASSecurityParametersFromNGRAN = -1;
static gint ett_ngap_NASC = -1;
static gint ett_ngap_NAS_PDU = -1;
static gint ett_ngap_EN_DCSONConfigurationTransfer = -1;
+static gint ett_ngap_BurstArrivalTime = -1;
+static gint ett_ngap_CoverageEnhancementLevel = -1;
+static gint ett_ngap_MDTModeEutra = -1;
+static gint ett_ngap_MeasurementsToActivate = -1;
+static gint ett_ngap_MDT_Location_Information = -1;
+static gint ett_ngap_NRMobilityHistoryReport = -1;
+static gint ett_ngap_LTEUERLFReportContainer = -1;
+static gint ett_ngap_NRUERLFReportContainer = -1;
+static gint ett_ngap_TargettoSource_Failure_TransparentContainer = -1;
+static gint ett_ngap_UERadioCapabilityForPagingOfNB_IoT = -1;
#include "packet-ngap-ett.c"
static expert_field ei_ngap_number_pages_le15 = EI_INIT;
@@ -148,6 +172,8 @@ struct ngap_conv_info {
address addr_b;
guint32 port_b;
GlobalRANNodeID_enum ranmode_id_b;
+ wmem_map_t *nbiot_ta;
+ wmem_tree_t *nbiot_ran_ue_ngap_id;
};
enum {
@@ -155,6 +181,16 @@ enum {
TARGET_TO_SOURCE_TRANSPARENT_CONTAINER
};
+struct ngap_supported_ta {
+ guint32 tac;
+ wmem_array_t *plmn;
+};
+
+struct ngap_tai {
+ guint32 plmn;
+ guint32 tac;
+};
+
struct ngap_private_data {
struct ngap_conv_info *ngap_conv;
guint32 procedure_code;
@@ -164,6 +200,9 @@ struct ngap_private_data {
guint32 handover_type_value;
guint8 data_coding_scheme;
guint8 transparent_container_type;
+ struct ngap_supported_ta *supported_ta;
+ struct ngap_tai *tai;
+ guint32 ran_ue_ngap_id;
};
enum {
@@ -179,10 +218,24 @@ static const enum_val_t ngap_target_ng_ran_container_vals[] = {
{NULL, NULL, -1}
};
+enum {
+ NGAP_LTE_CONTAINER_AUTOMATIC,
+ NGAP_LTE_CONTAINER_LEGACY,
+ NGAP_LTE_CONTAINER_NBIOT
+};
+
+static const enum_val_t ngap_lte_container_vals[] = {
+ {"automatic", "Automatic", NGAP_LTE_CONTAINER_AUTOMATIC},
+ {"legacy", "Legacy LTE", NGAP_LTE_CONTAINER_LEGACY},
+ {"nb-iot","NB-IoT", NGAP_LTE_CONTAINER_NBIOT},
+ {NULL, NULL, -1}
+};
+
/* Global variables */
static guint gbl_ngapSctpPort = SCTP_PORT_NGAP;
static gboolean ngap_dissect_container = TRUE;
static gint ngap_dissect_target_ng_ran_container_as = NGAP_NG_RAN_CONTAINER_AUTOMATIC;
+static gint ngap_dissect_lte_container_as = NGAP_LTE_CONTAINER_AUTOMATIC;
/* Dissector tables */
static dissector_table_t ngap_ies_dissector_table;
@@ -226,6 +279,7 @@ static int dissect_PathSwitchRequestAcknowledgeTransfer_PDU(tvbuff_t *tvb _U_, p
static int dissect_PathSwitchRequestTransfer_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_);
static int dissect_HandoverPreparationUnsuccessfulTransfer_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_);
static int dissect_PDUSessionResourceReleaseCommandTransfer_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_);
+static int dissect_TargetNGRANNode_ToSourceNGRANNode_FailureTransparentContainer_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_);
const value_string ngap_serialNumber_gs_vals[] = {
{ 0, "Display mode iamfdiate, cell wide"},
@@ -322,6 +376,30 @@ ngap_PeriodicRegistrationUpdateTimer_fmt(gchar *s, guint32 v)
}
}
+static void
+ngap_ExtendedPacketDelayBudget_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fms (%u)", (float)v/100, v);
+}
+
+static void
+ngap_Threshold_RSRP_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%ddBm (%u)", (gint32)v-156, v);
+}
+
+static void
+ngap_Threshold_RSRQ_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fdB (%u)", ((float)v/2)-43, v);
+}
+
+static void
+ngap_Threshold_SINR_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fdB (%u)", ((float)v/2)-23, v);
+}
+
static struct ngap_private_data*
ngap_get_private_data(packet_info *pinfo)
{
@@ -350,6 +428,29 @@ ngap_get_ranmode_id(address *addr, guint32 port, packet_info *pinfo)
return ranmode_id;
}
+static gboolean
+ngap_is_nbiot_ue(packet_info *pinfo)
+{
+ struct ngap_private_data *ngap_data = ngap_get_private_data(pinfo);
+
+ if (ngap_data->ngap_conv) {
+ wmem_tree_key_t tree_key[3];
+ guint32 *id;
+
+ tree_key[0].length = 1;
+ tree_key[0].key = &ngap_data->ran_ue_ngap_id;
+ tree_key[1].length = 1;
+ tree_key[1].key = &pinfo->num;
+ tree_key[2].length = 0;
+ tree_key[2].key = NULL;
+ id = (guint32*)wmem_tree_lookup32_array_le(ngap_data->ngap_conv->nbiot_ran_ue_ngap_id, tree_key);
+ if (id && (*id == ngap_data->ran_ue_ngap_id)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
#include "packet-ngap-fn.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
@@ -447,6 +548,8 @@ dissect_ngap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
copy_address_wmem(wmem_file_scope(), &ngap_data->ngap_conv->addr_b, &pinfo->dst);
ngap_data->ngap_conv->port_b = pinfo->destport;
ngap_data->ngap_conv->ranmode_id_b = (GlobalRANNodeID_enum)-1;
+ ngap_data->ngap_conv->nbiot_ta = wmem_map_new(wmem_file_scope(), wmem_int64_hash, g_int64_equal);
+ ngap_data->ngap_conv->nbiot_ran_ue_ngap_id = wmem_tree_new(wmem_file_scope());
conversation_add_proto_data(conversation, proto_ngap, ngap_data->ngap_conv);
}
@@ -578,6 +681,8 @@ proto_reg_handoff_ngap(void)
nr_rrc_ue_radio_paging_info_handle = find_dissector_add_dependency("nr-rrc.ue_radio_paging_info", proto_ngap);
nr_rrc_ue_radio_access_cap_info_handle = find_dissector_add_dependency("nr-rrc.ue_radio_access_cap_info", proto_ngap);
lte_rrc_ue_radio_paging_info_handle = find_dissector_add_dependency("lte-rrc.ue_radio_paging_info", proto_ngap);
+ lte_rrc_ue_radio_access_cap_info_handle = find_dissector_add_dependency("lte-rrc.ue_radio_access_cap_info", proto_ngap);
+ lte_rrc_ue_radio_paging_info_nb_handle = find_dissector_add_dependency("lte-rrc.ue_radio_paging_info.nb", proto_ngap);
dissector_add_for_decode_as("sctp.port", ngap_handle);
dissector_add_uint("sctp.ppi", NGAP_PROTOCOL_ID, ngap_handle);
Initialized=TRUE;
@@ -661,9 +766,13 @@ void proto_register_ngap(void) {
{ "nR", "ngap.RATRestrictionInformation.nR",
FT_BOOLEAN, 8, TFS(&tfs_restricted_not_restricted), 0x40,
NULL, HFILL }},
+ { &hf_ngap_RATRestrictionInformation_nR_unlicensed,
+ { "nR-unlicensed", "ngap.RATRestrictionInformation.nR_unlicensed",
+ FT_BOOLEAN, 8, TFS(&tfs_restricted_not_restricted), 0x20,
+ NULL, HFILL }},
{ &hf_ngap_RATRestrictionInformation_reserved,
{ "reserved", "ngap.RATRestrictionInformation.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x3f,
+ FT_UINT8, BASE_HEX, NULL, 0x1f,
NULL, HFILL }},
{ &hf_ngap_NrencyptionAlgorithms_nea1,
{ "128-NEA1", "ngap.NrencyptionAlgorithms.nea1",
@@ -729,6 +838,46 @@ void proto_register_ngap(void) {
{ "Reserved", "ngap.EUTRAintegrityProtectionAlgorithms.reserved",
FT_UINT16, BASE_HEX, NULL, 0x1fff,
NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M1,
+ { "M1", "ngap.MeasurementsToActivate.M1",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M2,
+ { "M2", "ngap.MeasurementsToActivate.M2",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M4,
+ { "M4", "ngap.MeasurementsToActivate.M4",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M5,
+ { "M5", "ngap.MeasurementsToActivate.M5",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M6,
+ { "M6", "ngap.MeasurementsToActivate.M6",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M7,
+ { "M7", "ngap.MeasurementsToActivate.M7",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_M1_from_event,
+ { "M1 from event", "ngap.MeasurementsToActivate.M1_from_event",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL }},
+ { &hf_ngap_MeasurementsToActivate_reserved,
+ { "Reserved", "ngap.MeasurementsToActivate.reserved",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
+ { &hf_ngap_MDT_Location_Information_GNSS,
+ { "GNSS", "ngap.MDT_Location_Information.GNSS",
+ FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL }},
+ { &hf_ngap_MDT_Location_Information_reserved,
+ { "Reserved", "ngap.MDT_Location_Information.reserved",
+ FT_BOOLEAN, 8, NULL, 0x7f,
+ NULL, HFILL }},
#include "packet-ngap-hfarr.c"
};
@@ -760,6 +909,16 @@ void proto_register_ngap(void) {
&ett_ngap_NASC,
&ett_ngap_NAS_PDU,
&ett_ngap_EN_DCSONConfigurationTransfer,
+ &ett_ngap_BurstArrivalTime,
+ &ett_ngap_CoverageEnhancementLevel,
+ &ett_ngap_MDTModeEutra,
+ &ett_ngap_MeasurementsToActivate,
+ &ett_ngap_MDT_Location_Information,
+ &ett_ngap_NRMobilityHistoryReport,
+ &ett_ngap_LTEUERLFReportContainer,
+ &ett_ngap_NRUERLFReportContainer,
+ &ett_ngap_TargettoSource_Failure_TransparentContainer,
+ &ett_ngap_UERadioCapabilityForPagingOfNB_IoT,
#include "packet-ngap-ettarr.c"
};
@@ -809,6 +968,9 @@ void proto_register_ngap(void) {
"Select whether target NG-RAN container should be decoded automatically"
" (based on NG Setup procedure) or manually",
&ngap_dissect_target_ng_ran_container_as, ngap_target_ng_ran_container_vals, FALSE);
+ prefs_register_enum_preference(ngap_module, "dissect_lte_container_as", "Dissect LTE container as",
+ "Select whether LTE container should be dissected as NB-IOT or legacy LTE",
+ &ngap_dissect_lte_container_as, ngap_lte_container_vals, FALSE);
}
/*