diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2013-08-23 10:42:11 +0000 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2013-08-23 10:42:11 +0000 |
commit | 483ee317f731a6c99b4e06cbd46c11b1392cdd1f (patch) | |
tree | 168126d4bd816e2fab7767b57994884f6d2fb041 /asn1/lte-rrc | |
parent | 71f7093cf3a81be8870086c9e9817aa87c4de02a (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.cnf | 242 | ||||
-rw-r--r-- | asn1/lte-rrc/packet-lte-rrc-template.c | 169 |
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(<e_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(<e_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(<e_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(<e_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 ? */ } } |