aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/lte-rrc
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-08-23 10:42:11 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-08-23 10:42:11 +0000
commit483ee317f731a6c99b4e06cbd46c11b1392cdd1f (patch)
tree168126d4bd816e2fab7767b57994884f6d2fb041 /asn1/lte-rrc
parent71f7093cf3a81be8870086c9e9817aa87c4de02a (diff)
From Martin Mathieson:
Follow-up of r51429 that - uses accessors to lazily allocate a private_data struct and returns the different parts based upon their use - includes the v1130 DRX Config svn path=/trunk/; revision=51489
Diffstat (limited to 'asn1/lte-rrc')
-rw-r--r--asn1/lte-rrc/lte-rrc.cnf242
-rw-r--r--asn1/lte-rrc/packet-lte-rrc-template.c169
2 files changed, 298 insertions, 113 deletions
diff --git a/asn1/lte-rrc/lte-rrc.cnf b/asn1/lte-rrc/lte-rrc.cnf
index c1c50e526b..f233e2a2b6 100644
--- a/asn1/lte-rrc/lte-rrc.cnf
+++ b/asn1/lte-rrc/lte-rrc.cnf
@@ -82,13 +82,14 @@ SI-OrPSI-GERAN TYPE_PREFIX
}
#.FN_BODY UE-CapabilityRAT-Container
- actx->private_data = NULL;
+ /* Since storing value+1, this effectively unsets this field */
+ private_data_set_rat_type(actx, 0);
%(DEFAULT_BODY)s
#.FN_BODY RAT-Type VAL_PTR = &rat_type
guint32 rat_type;
%(DEFAULT_BODY)s
- actx->private_data = GUINT_TO_POINTER(rat_type+1);
+ private_data_set_rat_type(actx, rat_type+1);
#RAT-Type ::= ENUMERATED {
# eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT,
@@ -126,8 +127,8 @@ if(ue_cap_tvb){
proto_tree *subtree, *subtree2;
guint8 byte;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_UE_CapabilityRAT_Container);
- if (actx->private_data) {
- switch(GPOINTER_TO_UINT(actx->private_data)-1){
+ if (private_data_get_rat_type(actx)) {
+ switch(private_data_get_rat_type(actx)-1){
case RAT_Type_eutra:
/* eutra */
dissect_lte_rrc_UE_EUTRA_Capability_PDU(ue_cap_tvb, actx->pinfo, subtree, NULL);
@@ -173,7 +174,8 @@ if(ue_cap_tvb){
default:
break;
}
- actx->private_data = NULL;
+ /* Unset again */
+ private_data_set_rat_type(actx, 0);
}
}
@@ -226,13 +228,14 @@ if(ue_cap_tvb){
}
#.FN_BODY Handover
- actx->private_data = NULL;
+ /* Initialise to invalid value */
+ private_data_set_rat_type(actx, 0);
%(DEFAULT_BODY)s
#.FN_BODY Handover/targetRAT-Type VAL_PTR = &target_rat_type
guint32 target_rat_type;
%(DEFAULT_BODY)s
- actx->private_data = GUINT_TO_POINTER(target_rat_type+1);
+ private_data_set_rat_target_type(actx, target_rat_type+1);
#.FN_BODY Handover/targetRAT-MessageContainer VAL_PTR = &target_rat_msg_cont_tvb
tvbuff_t *target_rat_msg_cont_tvb = NULL;
@@ -241,8 +244,8 @@ if(ue_cap_tvb){
guint8 byte;
proto_tree *subtree;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_targetRAT_MessageContainer);
- if (actx->private_data) {
- switch(GPOINTER_TO_UINT(actx->private_data)-1){
+ if (private_data_get_rat_target_type(actx)) {
+ switch (private_data_get_rat_target_type(actx)-1){
case T_targetRAT_Type_utra:
/* utra */
if (rrc_irat_ho_to_utran_cmd_handle)
@@ -270,7 +273,8 @@ if(ue_cap_tvb){
default:
break;
}
- actx->private_data = NULL;
+ /* Unset again */
+ private_data_set_rat_target_type(actx, 0);
}
}
@@ -301,10 +305,10 @@ if(ue_cap_tvb){
#.FN_BODY SI-OrPSI-GERAN VAL_PTR = &si_or_psi_geran
guint32 si_or_psi_geran;
%(DEFAULT_BODY)s
- actx->private_data = GUINT_TO_POINTER(si_or_psi_geran+1);
+ private_data_set_si_or_psi_geran(actx, si_or_psi_geran+1);
#.FN_BODY CellInfoGERAN-r9
- actx->private_data = GUINT_TO_POINTER(SI_OrPSI_GERAN_si+1); /* SI message */
+ private_data_set_si_or_psi_geran(actx, SI_OrPSI_GERAN_si+1); /* SI message */
%(DEFAULT_BODY)s
#.FN_BODY SystemInfoListGERAN/_item VAL_PTR = &sys_info_list_tvb
@@ -313,8 +317,8 @@ if(ue_cap_tvb){
%(DEFAULT_BODY)s
if (sys_info_list_tvb) {
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_siPsiSibContainer);
- if (actx->private_data) {
- switch (GPOINTER_TO_UINT(actx->private_data)-1) {
+ if (private_data_get_si_or_psi_geran(actx)) {
+ switch (private_data_get_si_or_psi_geran(actx)-1) {
case SI_OrPSI_GERAN_si:
/* SI message */
if (gsm_a_dtap_handle) {
@@ -330,7 +334,8 @@ if(ue_cap_tvb){
default:
break;
}
- actx->private_data = NULL;
+ /* Unset value */
+ private_data_set_si_or_psi_geran(actx, 0);
}
}
@@ -542,7 +547,7 @@ SystemInformationBlockType11/messageIdentifier TYPE=FT_UINT16 DISPLAY=BASE_DEC|B
#.FN_FTR SystemInformationBlockType11/messageIdentifier
if (msg_id_tvb) {
- actx->private_data = GUINT_TO_POINTER(tvb_get_ntohs(msg_id_tvb, 0) << 16);
+ private_data_set_message_identifier(actx, tvb_get_ntohs(msg_id_tvb, 0) << 16);
actx->created_item = proto_tree_add_item(tree, hf_index, msg_id_tvb, 0, 2, ENC_BIG_ENDIAN);
}
@@ -553,7 +558,8 @@ SystemInformationBlockType11/messageIdentifier TYPE=FT_UINT16 DISPLAY=BASE_DEC|B
#.FN_FTR SystemInformationBlockType11/serialNumber
if (serial_nb_tvb) {
proto_tree *subtree;
- actx->private_data = GUINT_TO_POINTER(GPOINTER_TO_UINT(actx->private_data) | tvb_get_ntohs(serial_nb_tvb, 0));
+ private_data_set_message_identifier(actx,
+ private_data_get_message_identifier(actx) | tvb_get_ntohs(serial_nb_tvb, 0));
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_serialNumber);
proto_tree_add_item(subtree, hf_lte_rrc_serialNumber_gs, serial_nb_tvb, 0, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(subtree, hf_lte_rrc_serialNumber_msg_code, serial_nb_tvb, 0, 2, ENC_BIG_ENDIAN);
@@ -570,7 +576,7 @@ SystemInformationBlockType11/messageIdentifier TYPE=FT_UINT16 DISPLAY=BASE_DEC|B
guint32 dataCodingScheme;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_dataCodingScheme);
dataCodingScheme = dissect_cbs_data_coding_scheme(data_coding_scheme_tvb, actx->pinfo, subtree, 0);
- g_hash_table_insert(lte_rrc_etws_cmas_dcs_hash, actx->private_data,
+ g_hash_table_insert(lte_rrc_etws_cmas_dcs_hash, GUINT_TO_POINTER((guint)private_data_get_message_identifier(actx)),
GUINT_TO_POINTER(dataCodingScheme));
}
@@ -580,7 +586,7 @@ SystemInformationBlockType11/messageIdentifier TYPE=FT_UINT16 DISPLAY=BASE_DEC|B
%(DEFAULT_BODY)s
#.FN_FTR SystemInformationBlockType11/warningMessageSegment
- p_dcs = g_hash_table_lookup(lte_rrc_etws_cmas_dcs_hash, actx->private_data);
+ p_dcs = g_hash_table_lookup(lte_rrc_etws_cmas_dcs_hash, GUINT_TO_POINTER((guint)private_data_get_message_identifier(actx)));
if (warning_msg_seg_tvb && p_dcs) {
proto_tree *subtree;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_warningMessageSegment);
@@ -596,7 +602,7 @@ SystemInformationBlockType12-r9/messageIdentifier-r9 TYPE=FT_UINT16 DISPLAY=BASE
#.FN_FTR SystemInformationBlockType12-r9/messageIdentifier-r9
if (msg_id_tvb) {
- actx->private_data = GUINT_TO_POINTER(tvb_get_ntohs(msg_id_tvb, 0) << 16);
+ private_data_set_message_identifier(actx, tvb_get_ntohs(msg_id_tvb, 0) << 16);
actx->created_item = proto_tree_add_item(tree, hf_index, msg_id_tvb, 0, 2, ENC_BIG_ENDIAN);
}
@@ -607,7 +613,8 @@ SystemInformationBlockType12-r9/messageIdentifier-r9 TYPE=FT_UINT16 DISPLAY=BASE
#.FN_FTR SystemInformationBlockType12-r9/serialNumber-r9
if (serial_nb_tvb) {
proto_tree *subtree;
- actx->private_data = GUINT_TO_POINTER(GPOINTER_TO_UINT(actx->private_data) | tvb_get_ntohs(serial_nb_tvb, 0));
+ private_data_set_message_identifier(actx,
+ private_data_get_message_identifier(actx) | tvb_get_ntohs(serial_nb_tvb, 0));
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_serialNumber);
proto_tree_add_item(subtree, hf_lte_rrc_serialNumber_gs, serial_nb_tvb, 0, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(subtree, hf_lte_rrc_serialNumber_msg_code, serial_nb_tvb, 0, 2, ENC_BIG_ENDIAN);
@@ -624,7 +631,7 @@ SystemInformationBlockType12-r9/messageIdentifier-r9 TYPE=FT_UINT16 DISPLAY=BASE
guint32 dataCodingScheme;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_dataCodingScheme);
dataCodingScheme = dissect_cbs_data_coding_scheme(data_coding_scheme_tvb, actx->pinfo, subtree, 0);
- g_hash_table_insert(lte_rrc_etws_cmas_dcs_hash, actx->private_data,
+ g_hash_table_insert(lte_rrc_etws_cmas_dcs_hash, GUINT_TO_POINTER((guint)private_data_get_message_identifier(actx)),
GUINT_TO_POINTER(dataCodingScheme));
}
@@ -634,7 +641,7 @@ SystemInformationBlockType12-r9/messageIdentifier-r9 TYPE=FT_UINT16 DISPLAY=BASE
%(DEFAULT_BODY)s
#.FN_FTR SystemInformationBlockType12-r9/warningMessageSegment-r9
- p_dcs = g_hash_table_lookup(lte_rrc_etws_cmas_dcs_hash, actx->private_data);
+ p_dcs = g_hash_table_lookup(lte_rrc_etws_cmas_dcs_hash, GUINT_TO_POINTER((guint)private_data_get_message_identifier(actx)));
if (warning_msg_seg_tvb && p_dcs) {
proto_tree *subtree;
subtree = proto_item_add_subtree(actx->created_item, ett_lte_rrc_warningMessageSegment);
@@ -743,6 +750,19 @@ CQI-ReportConfig-r10/nomPDSCH-RS-EPRE-Offset STRINGS=VALS(lte_rrc_nomPDSCH_RS_EP
#.TYPE_ATTR
CQI-ReportConfigSCell-r10/nomPDSCH-RS-EPRE-Offset-r10 STRINGS=VALS(lte_rrc_nomPDSCH_RS_EPRE_Offset_vals)
+#.FN_BODY MAC-MainConfig
+ /* Accumulate values in drx_config while dissecting DRX config.
+ Do this here rather than down in DRX-Config so that we will see
+ fields overwritten in the R11 extension */
+ drx_config_t *drx_config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ /* Verify that config is valid */
+ if (drx_config->configured) {
+ drx_check_config_sane(drx_config, actx);
+ drx_config->configured = FALSE;
+ }
+
+
#.FN_BODY MAC-MainConfig/eag_1/sr-ProhibitTimer-r9 VAL_PTR=&timer
guint32 timer;
%(DEFAULT_BODY)s
@@ -1176,10 +1196,9 @@ SoundingRS-UL-ConfigDedicated/setup/duration STRINGS=TFS(&lte_rrc_duration_val)
#.FN_BODY DRB-ToAddMod
struct mac_lte_info *p_mac_lte_info;
- /* Clear out the struct */
- static drb_mapping_t drb_mapping;
- memset(&drb_mapping, 0, sizeof(drb_mapping));
- actx->private_data = (void*)&drb_mapping;
+ /* Get the struct and clear it out */
+ drb_mapping_t *drb_mapping = private_data_get_drb_mapping(actx);
+ memset(drb_mapping, 0, sizeof(drb_mapping));
%(DEFAULT_BODY)s
/* Need UE identifier */
p_mac_lte_info = (mac_lte_info *)p_get_proto_data(actx->pinfo->fd, proto_mac_lte, 0);
@@ -1187,18 +1206,17 @@ SoundingRS-UL-ConfigDedicated/setup/duration STRINGS=TFS(&lte_rrc_duration_val)
return offset;
}
else {
- drb_mapping.ueid = p_mac_lte_info->ueid;
+ drb_mapping->ueid = p_mac_lte_info->ueid;
}
/* Tell MAC about this mapping */
- set_mac_lte_channel_mapping(&drb_mapping);
- /* Clear out struct again, just in case */
+ set_mac_lte_channel_mapping(drb_mapping);
/* Also tell RLC how many PDCP sequence number bits */
- if (drb_mapping.pdcp_sn_size_present) {
- set_rlc_lte_drb_pdcp_seqnum_length(drb_mapping.ueid,
- drb_mapping.drbid,
- drb_mapping.pdcp_sn_size);
+ if (drb_mapping->pdcp_sn_size_present) {
+ set_rlc_lte_drb_pdcp_seqnum_length(drb_mapping->ueid,
+ drb_mapping->drbid,
+ drb_mapping->pdcp_sn_size);
}
/* Clear out the struct again */
@@ -1207,78 +1225,87 @@ SoundingRS-UL-ConfigDedicated/setup/duration STRINGS=TFS(&lte_rrc_duration_val)
#.FN_BODY DRB-Identity VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->drbid = (guint8)value;
+ if (mapping != NULL) {
+ mapping->drbid = (guint8)value;
}
#.FN_BODY RLC-Config VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->rlcMode = (value==0) ? RLC_AM_MODE : RLC_UM_MODE;
- ((drb_mapping_t*)actx->private_data)->rlcMode_present = TRUE;
+ if (mapping != NULL) {
+ mapping->rlcMode = (value==0) ? RLC_AM_MODE : RLC_UM_MODE;
+ mapping->rlcMode_present = TRUE;
- if (((drb_mapping_t*)actx->private_data)->rlcMode == RLC_AM_MODE) {
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size = 12;
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size_present = TRUE;
+ if (mapping->rlcMode == RLC_AM_MODE) {
+ mapping->pdcp_sn_size = 12;
+ mapping->pdcp_sn_size_present = TRUE;
}
}
#.FN_BODY DRB-ToAddMod/logicalChannelIdentity VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->lcid = (guint8)value;
- ((drb_mapping_t*)actx->private_data)->lcid_present = TRUE;
+ if (mapping != NULL) {
+ mapping->lcid = (guint8)value;
+ mapping->lcid_present = TRUE;
}
#.FN_BODY SN-FieldLength VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->um_sn_length = (value==0) ? 5 : 10;
- ((drb_mapping_t*)actx->private_data)->um_sn_length_present = TRUE;
+ if (mapping != NULL) {
+ mapping->um_sn_length = (value==0) ? 5 : 10;
+ mapping->um_sn_length_present = TRUE;
}
#.FN_BODY LogicalChannelConfig/ul-SpecificParameters/priority VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->ul_priority = value;
- ((drb_mapping_t*)actx->private_data)->ul_priority_present = TRUE;
+ if (mapping != NULL) {
+ mapping->ul_priority = value;
+ mapping->ul_priority_present = TRUE;
}
#.FN_BODY PDCP-Config/rlc-UM/pdcp-SN-Size VAL_PTR=&value
guint32 value;
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
%(DEFAULT_BODY)s
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size = (value==0) ? 7 : 12;
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size_present = TRUE;
+ if (mapping != NULL) {
+ mapping->pdcp_sn_size = (value==0) ? 7 : 12;
+ mapping->pdcp_sn_size_present = TRUE;
}
-#.FN_FTR PDCP-Config/eag_2/pdcp-SN-Size-v1130
- if (actx->private_data != NULL) {
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size = 15;
- ((drb_mapping_t*)actx->private_data)->pdcp_sn_size_present = TRUE;
+#.FN_BODY PDCP-Config/eag_2/pdcp-SN-Size-v1130
+ drb_mapping_t *mapping = private_data_get_drb_mapping(actx);
+%(DEFAULT_BODY)s
+ if (mapping != NULL) {
+ mapping->pdcp_sn_size = 15;
+ mapping->pdcp_sn_size_present = TRUE;
}
#.FN_BODY RACH-ConfigCommon/preambleInfo
%(DEFAULT_BODY)s
- actx->private_data = NULL;
+ /* Initialise to invalid value */
+ private_data_set_ra_preambles(actx, 0);
#.FN_BODY RACH-ConfigCommon/preambleInfo/numberOfRA-Preambles VAL_PTR=&value
guint value;
%(DEFAULT_BODY)s
/* This is mandatory, store value */
- actx->private_data = GUINT_TO_POINTER(value);
+ private_data_set_ra_preambles(actx, value);
#.FN_BODY RACH-ConfigCommon/preambleInfo/preamblesGroupAConfig/sizeOfRA-PreamblesGroupA VAL_PTR=&value
guint ra_value, value;
%(DEFAULT_BODY)s
/* Retrived stored value for RA (both Group A & Group B) */
- ra_value = GPOINTER_TO_UINT(actx->private_data);
+ ra_value = private_data_get_ra_preambles(actx);
if (value > ra_value) {
/* Something is wrong if A has more RAPIDs than A & B combined! */
expert_add_info_format_text(actx->pinfo, actx->created_item, &ei_lte_rrc_too_many_group_a_rapids,
@@ -1287,155 +1314,176 @@ SoundingRS-UL-ConfigDedicated/setup/duration STRINGS=TFS(&lte_rrc_duration_val)
val_to_str_const(ra_value, lte_rrc_T_numberOfRA_Preambles_vals, "Unknown"));
}
- actx->private_data = NULL;
-
+ /* Reset again */
+ private_data_set_ra_preambles(actx, 0);
-#.FN_BODY DRX-Config/setup
- /* Accumulate values in drx_config while dissecting DRX config */
- static drx_config_t drx_config;
- memset(&drx_config, 0, sizeof(drx_config));
- actx->private_data = &drx_config;
-%(DEFAULT_BODY)s
- /* Verify that config is valid */
- drx_check_config_sane(&drx_config, actx);
-
- /* Unset again afterwards */
- actx->private_data = NULL;
-
#.FN_BODY DRX-Config/setup/onDurationTimer VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
+ /* Set 'configured' state so that config can be examine once complete! */
+ config->configured = TRUE;
config->onDurationTimer = drx_lookup_onDurationTimer(value);
#.FN_BODY DRX-Config/setup/drx-InactivityTimer VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->inactivityTimer = drx_lookup_inactivityTimer(value);
#.FN_BODY DRX-Config/setup/drx-RetransmissionTimer VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->retransmissionTimer = drx_lookup_retransmissionTimer(value);
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->longCycle = drx_lookup_longCycle(value);
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf10 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf20 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf32 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf40 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf64 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf80 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf128 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf160 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf256 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf320 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf512 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf640 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf1024 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf1280 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf2048 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/longDRX-CycleStartOffset/sf2560 VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->cycleOffset = value;
#.FN_BODY DRX-Config/setup/shortDRX/shortDRX-Cycle VAL_PTR=&value
guint32 value;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->shortCycleConfigured = TRUE;
config->shortCycle = drx_lookup_shortCycle(value);
#.FN_BODY DRX-Config/setup/shortDRX/drxShortCycleTimer VAL_PTR=&timer
guint32 timer;
- drx_config_t* config = (drx_config_t*)actx->private_data;
+ drx_config_t* config = private_data_get_drx_config(actx);
%(DEFAULT_BODY)s
config->shortCycleTimer = timer;
#.FN_FTR DRX-Config/setup/shortDRX/drxShortCycleTimer
proto_item_append_text(actx->created_item, " shortDRX-Cycle%s", plurality(timer, "", "s"));
+#.FN_BODY DRX-Config-v1130/drx-RetransmissionTimer-v1130 VAL_PTR=&value
+ guint32 value;
+ drx_config_t* config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ config->retransmissionTimer = 0;
+
+#.FN_BODY DRX-Config-v1130/longDRX-CycleStartOffset-v1130 VAL_PTR=&value
+ guint32 value;
+ drx_config_t* config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ config->longCycle = drx_lookup_longCycle_v1130(value);
+
+#.FN_BODY DRX-Config-v1130/longDRX-CycleStartOffset-v1130/sf60-v1130 VAL_PTR=&value
+ guint32 value;
+ drx_config_t* config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ config->cycleOffset = value;
+
+#.FN_BODY DRX-Config-v1130/longDRX-CycleStartOffset-v1130/sf70-v1130 VAL_PTR=&value
+ guint32 value;
+ drx_config_t* config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ config->cycleOffset = value;
+
+#.FN_BODY DRX-Config-v1130/shortDRX-Cycle-v1130 VAL_PTR=&value
+ guint32 value;
+ drx_config_t* config = private_data_get_drx_config(actx);
+%(DEFAULT_BODY)s
+ /* Presumably config->shortCycleConfigured will be set... */
+ config->shortCycle = 4;
+
diff --git a/asn1/lte-rrc/packet-lte-rrc-template.c b/asn1/lte-rrc/packet-lte-rrc-template.c
index 1f7d1f22f8..c08a466b7b 100644
--- a/asn1/lte-rrc/packet-lte-rrc-template.c
+++ b/asn1/lte-rrc/packet-lte-rrc-template.c
@@ -33,6 +33,7 @@
#include <epan/packet.h>
#include <epan/asn1.h>
#include <epan/expert.h>
+#include <epan/wmem/wmem.h>
#include "packet-per.h"
#include "packet-rrc.h"
@@ -1784,6 +1785,144 @@ static const value_string lte_rrc_warningType_vals[] = {
{ 0, NULL},
};
+
+/*****************************************************************************/
+/* Packet private data */
+/* For this dissector, all access to actx->private_data should be made */
+/* through this API, which ensures that they will not overwrite each other!! */
+/*****************************************************************************/
+
+/* Dedicated DRX config. Currently used to verify that a sensible config is given.
+ TODO: would be good to configure MAC with these settings and (optionally) show
+ DRX config and state (cycles/timers) attached to each UL/DL PDU! */
+typedef struct drx_config_t {
+ gboolean configured;
+ guint32 onDurationTimer;
+ guint32 inactivityTimer;
+ guint32 retransmissionTimer;
+ guint32 longCycle;
+ guint32 cycleOffset;
+ /* Optional Short cycle */
+ gboolean shortCycleConfigured;
+ guint32 shortCycle;
+ guint32 shortCycleTimer;
+} drx_config_t;
+
+
+/**********************************************************/
+/* Struct to store all current uses of packet private data */
+typedef struct lte_rrc_private_data_t
+{
+ guint32 rat_type; /* Store as +1 real value, so 0 means 'not set' */
+ guint32 target_rat_type; /* Store as +1 real value, so 0 means 'not set' */
+ guint32 si_or_psi_geran; /* Store as +1 real value, so 0 means 'not set' */
+ guint16 message_identifier;
+ guint8 ra_preambles;
+ drb_mapping_t drb_mapping;
+ drx_config_t drx_config;
+} lte_rrc_private_data_t;
+
+/* Helper function to get or create a struct that will be actx->private_data */
+static lte_rrc_private_data_t* lte_rrc_get_private_data(asn1_ctx_t *actx)
+{
+ if (actx->private_data != NULL) {
+ return (lte_rrc_private_data_t*)actx->private_data;
+ }
+ else {
+ lte_rrc_private_data_t* new_struct =
+ (lte_rrc_private_data_t*)wmem_alloc0(wmem_packet_scope(), sizeof(lte_rrc_private_data_t));
+ actx->private_data = new_struct;
+ return new_struct;
+ }
+}
+
+
+/* DRX config data */
+static drx_config_t* private_data_get_drx_config(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return &private_data->drx_config;
+}
+
+/* DRB mapping info */
+static drb_mapping_t* private_data_get_drb_mapping(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return &private_data->drb_mapping;
+}
+
+
+/* RAT type */
+static guint32 private_data_get_rat_type(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return private_data->rat_type;
+}
+
+static void private_data_set_rat_type(asn1_ctx_t *actx, guint32 rat_type)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ private_data->rat_type = rat_type;
+}
+
+
+/* Target RAT type */
+static guint32 private_data_get_rat_target_type(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return private_data->target_rat_type;
+}
+
+static void private_data_set_rat_target_type(asn1_ctx_t *actx, guint32 target_rat_type)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ private_data->target_rat_type = target_rat_type;
+}
+
+
+/* si_or_psi_geran */
+static guint32 private_data_get_si_or_psi_geran(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return private_data->si_or_psi_geran;
+}
+
+static void private_data_set_si_or_psi_geran(asn1_ctx_t *actx, guint32 si_or_psi_geran)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ private_data->si_or_psi_geran = si_or_psi_geran;
+}
+
+
+/* Message identifier */
+static guint16 private_data_get_message_identifier(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return private_data->message_identifier;
+}
+
+static void private_data_set_message_identifier(asn1_ctx_t *actx, guint16 message_identifier)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ private_data->message_identifier = message_identifier;
+}
+
+
+/* Number of RA-preambles */
+static guint8 private_data_get_ra_preambles(asn1_ctx_t *actx)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ return private_data->ra_preambles;
+}
+
+static void private_data_set_ra_preambles(asn1_ctx_t *actx, guint8 ra_preambles)
+{
+ lte_rrc_private_data_t *private_data = (lte_rrc_private_data_t*)lte_rrc_get_private_data(actx);
+ private_data->ra_preambles = ra_preambles;
+}
+/*****************************************************************************/
+
+
static void
lte_rrc_localTimeOffset_fmt(gchar *s, guint32 v)
{
@@ -1989,10 +2128,10 @@ static guint32 drx_lookup_longCycle(guint32 idx)
return (sizeof(vals)/(sizeof(guint32)) - 1);
}
-static guint32 drx_lookup_shortCycle(guint32 idx)
+static guint32 drx_lookup_longCycle_v1130(guint32 idx)
{
static const guint32 vals[] = {
- 2,5,8,10,16,20,32,40,64,80,128,160,256,320,512,640
+ 60,70
};
if (idx < (sizeof(vals)/sizeof(guint32))) {
@@ -2001,21 +2140,18 @@ static guint32 drx_lookup_shortCycle(guint32 idx)
return (sizeof(vals)/(sizeof(guint32)) - 1);
}
-/* Dedicated DRX config. Currently used to verify that a sensible config is given.
- TODO: would be good to configure MAC with these settings and (optionally) show
- DRX config and state (cycles/timers) attached to each UL/DL PDU! */
-typedef struct drx_config_t {
- guint32 onDurationTimer;
- guint32 inactivityTimer;
- guint32 retransmissionTimer;
- guint32 longCycle;
- guint32 cycleOffset;
- /* Optional Short cycle */
- gboolean shortCycleConfigured;
- guint32 shortCycle;
- guint32 shortCycleTimer;
-} drx_config_t;
+static guint32 drx_lookup_shortCycle(guint32 idx)
+{
+ static const guint32 vals[] = {
+ 2,5,8,10,16,20,32,40,64,80,128,160,256,320,512,640
+ };
+
+ if (idx < (sizeof(vals)/sizeof(guint32))) {
+ return vals[idx];
+ }
+ return (sizeof(vals)/(sizeof(guint32)) - 1);
+}
static void drx_check_config_sane(drx_config_t *config, asn1_ctx_t *actx)
{
@@ -2046,6 +2182,7 @@ static void drx_check_config_sane(drx_config_t *config, asn1_ctx_t *actx)
"OnDurationTimer (%u) should not be longer than the short cycle (%u)",
config->onDurationTimer, config->shortCycle);
}
+ /* TODO: check that (onDuration+(shortCycle*shortCycleTimer)) < longCycle ? */
/* TODO: check that (shortCycle*shortCycleTimer) < longCycle ? */
}
}