From 2f3d6bc99ac55f582c16c071df793238e242010e Mon Sep 17 00:00:00 2001 From: roux Date: Wed, 15 Jul 2015 16:30:07 +0000 Subject: [PATCH] =?UTF-8?q?This=20commit=20is=20a=20very=20unclean=20fix?= =?UTF-8?q?=20to=20deal=20with=20extension=20version=20groups=20present=20?= =?UTF-8?q?in=20the=20RRC=20release=2010=20ASN.1=20file=20(extensions=20be?= =?UTF-8?q?tween=20[[=C2=A0and=20]]).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Basically we do a syntactic replacement at compile time. [[ becomes ' SEQUENCE {' ]] becomes '} OPTIONAL' is 'ext' where N is a number increasing at each new extension group in a given definition. The UPER encoding for the two syntaxes is identical (as far as y understanding of the specifications goes). The XER encoding is different, due to the new 'ext' name. Other encodings may be different. The real solution is to fix the ASN.1 compiler. This is not a simple task. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7705 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- cmake_targets/tools/generate_asn1 | 105 +++++++++++++++++++++++++- openair2/LAYER2/MAC/config.c | 4 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 7 ++ openair2/RRC/LITE/rrc_UE.c | 34 ++++----- openair2/RRC/LITE/rrc_eNB.c | 6 +- 5 files changed, 134 insertions(+), 22 deletions(-) diff --git a/cmake_targets/tools/generate_asn1 b/cmake_targets/tools/generate_asn1 index 9705838489..79becbf288 100755 --- a/cmake_targets/tools/generate_asn1 +++ b/cmake_targets/tools/generate_asn1 @@ -6,7 +6,110 @@ mkdir -p $1 cd $1 shift -asn1c -gen-PER -fcompound-names $* 2>&1 | grep -v -- '->' | grep -v '^Compiled' |grep -v sample +#if this script is called with only 2 arguments (so 1 here after the shift), it's for RRC +#(there may be a better way...) +if [ $# -eq 1 ]; then + +#asn1c does not work well with extension groups, we need the following fix: +# replace [[ by ' SEQUENCE {' +# and ]] by '} OPTIONAL' +# is ext with N starting from 1 and incremented at each new [[ ]] just +#following another [[ ]] +# +#this is what the following C program does + +echo generate asnfix.c + +cat << EOF > asnfix.c +/* transforms: + * '[[' to 'name SEQUENCE {' + * ']]' to '} OPTIONAL' + * name is ext1, ext2, ..., for each [[ at the same level + * levels are delimited by { and } + * -- to end of line is a comment and unprocessed + * nested [[ ]] not handled + * { and } must be balanced + * [[ and ]] can be whatever, every combination is valid + */ +#include +#include + +void level(int toplevel) +{ + int c; + int next_name = 1; + + while (1) { + c = getchar(); +next: + if (c == EOF) { if (toplevel) break; abort(); } + + if (c == '-') { + c = getchar(); + if (c != '-') { putchar('-'); goto next; } + putchar(c); putchar(c); + while (1) { + c = getchar(); if (c == EOF) abort(); + putchar(c); + if (c == '\n') break; + } + continue; + } + + if (c == '[') { + c = getchar(); + if (c != '[') { putchar('['); goto next; } + printf("ext%d SEQUENCE {", next_name); + next_name++; + continue; + } + + if (c == ']') { + c = getchar(); + if (c != ']') { putchar(']'); goto next; } + printf("} OPTIONAL"); + continue; + } + + putchar(c); + if (c == '}') { if (toplevel) abort(); break; } + if (c == '{') level(0); + } +} + +int main(void) +{ + level(1); + fflush(stdout); + return 0; +} +EOF + +echo compile asnfix.c + +gcc -Wall -o asnfix asnfix.c + +echo run asnfix on $1 + +./asnfix < $1 > fixed_grammar.asn + +rm -f asnfix asnfix.c + +echo done with asnfix + +echo running asn1c + +asn1c -gen-PER -fcompound-names fixed_grammar.asn 2>&1 | grep -v -- '->' | grep -v '^Compiled' |grep -v sample + +rm -f fixed_grammar.asn + +echo asn1c done + +else + +asn1c -gen-PER -fcompound-names $* 2>&1 | grep -v -- '->' | grep -v '^Compiled' |grep -v sample + +fi awk ' BEGIN { diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 61dea4889c..b19e7f72e8 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -220,8 +220,8 @@ rrc_mac_config_req( #ifdef Rel10 - if (mac_MainConfig->sr_ProhibitTimer_r9) { - UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->sr_ProhibitTimer_r9; + if (mac_MainConfig->ext1 && mac_MainConfig->ext1->sr_ProhibitTimer_r9) { + UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9; } else { UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (uint16_t) 0; } diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 0ec3a29590..5b10c19600 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -688,10 +688,14 @@ uint8_t do_SIB23(uint8_t Mod_id, (*sib2)->ac_BarringInfo = NULL; #ifdef Rel10 +#if 0 (*sib2)->ssac_BarringForMMTEL_Voice_r9 = NULL; (*sib2)->ssac_BarringForMMTEL_Video_r9 = NULL; (*sib2)->ac_BarringForCSFB_r10 = NULL; #endif + (*sib2)->ext1 = NULL; + (*sib2)->ext2 = NULL; +#endif #if defined(ENABLE_ITTI) @@ -989,10 +993,13 @@ uint8_t do_SIB23(uint8_t Mod_id, /// (*SIB3) #ifdef Rel10 + (*sib3)->ext1 = NULL; +#if 0 (*sib3)->s_IntraSearch_v920=NULL; (*sib3)->s_NonIntraSearch_v920=NULL; (*sib3)->q_QualMin_r9=NULL; (*sib3)->threshServingLowQ_r9=NULL; +#endif #endif (*sib3)->cellReselectionInfoCommon.q_Hyst=SystemInformationBlockType3__cellReselectionInfoCommon__q_Hyst_dB4; diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 69ee1b1b16..bfeb3ef7e8 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -2883,33 +2883,33 @@ static void dump_sib2( SystemInformationBlockType2_t *sib2 ) } else LOG_I( RRC, "lateNonCriticalExtension : not defined\n" ); - if (sib2->ssac_BarringForMMTEL_Voice_r9) { + if (sib2->ext1 && sib2->ext1->ssac_BarringForMMTEL_Voice_r9) { LOG_I( RRC, "ssac_BarringForMMTEL_Voice_r9->ac_BarringFactor : %ld\n", - sib2->ssac_BarringForMMTEL_Voice_r9->ac_BarringFactor ); + sib2->ext1->ssac_BarringForMMTEL_Voice_r9->ac_BarringFactor ); LOG_I( RRC, "ssac_BarringForMMTEL_Voice_r9->ac_BarringTime : %ld\n", - sib2->ssac_BarringForMMTEL_Voice_r9->ac_BarringTime ); + sib2->ext1->ssac_BarringForMMTEL_Voice_r9->ac_BarringTime ); LOG_I( RRC, "ssac_BarringForMMTEL_Voice_r9->ac_BarringForSpecialAC : %"PRIu32"\n", - BIT_STRING_to_uint32(&sib2->ssac_BarringForMMTEL_Voice_r9->ac_BarringForSpecialAC) ); + BIT_STRING_to_uint32(&sib2->ext1->ssac_BarringForMMTEL_Voice_r9->ac_BarringForSpecialAC) ); } else LOG_I( RRC, "ssac_BarringForMMTEL_Voice_r9 : not defined\n" ); - if (sib2->ssac_BarringForMMTEL_Video_r9) { + if (sib2->ext1 && sib2->ext1->ssac_BarringForMMTEL_Video_r9) { LOG_I( RRC, "ssac_BarringForMMTEL_Video_r9->ac_BarringFactor : %ld\n", - sib2->ssac_BarringForMMTEL_Video_r9->ac_BarringFactor ); + sib2->ext1->ssac_BarringForMMTEL_Video_r9->ac_BarringFactor ); LOG_I( RRC, "ssac_BarringForMMTEL_Video_r9->ac_BarringTime : %ld\n", - sib2->ssac_BarringForMMTEL_Video_r9->ac_BarringTime ); + sib2->ext1->ssac_BarringForMMTEL_Video_r9->ac_BarringTime ); LOG_I( RRC, "ssac_BarringForMMTEL_Video_r9->ac_BarringForSpecialAC : %"PRIu32"\n", - BIT_STRING_to_uint32(&sib2->ssac_BarringForMMTEL_Video_r9->ac_BarringForSpecialAC) ); + BIT_STRING_to_uint32(&sib2->ext1->ssac_BarringForMMTEL_Video_r9->ac_BarringForSpecialAC) ); } else LOG_I( RRC, "ssac_BarringForMMTEL_Video_r9 : not defined\n" ); - if (sib2->ac_BarringForCSFB_r10) { + if (sib2->ext2 && sib2->ext2->ac_BarringForCSFB_r10) { LOG_I( RRC, "ac_BarringForCSFB_r10->ac_BarringFactor : %ld\n", - sib2->ac_BarringForCSFB_r10->ac_BarringFactor ); + sib2->ext2->ac_BarringForCSFB_r10->ac_BarringFactor ); LOG_I( RRC, "ac_BarringForCSFB_r10->ac_BarringTime : %ld\n", - sib2->ac_BarringForCSFB_r10->ac_BarringTime ); + sib2->ext2->ac_BarringForCSFB_r10->ac_BarringTime ); LOG_I( RRC, "ac_BarringForCSFB_r10->ac_BarringForSpecialAC : %"PRIu32"\n", - BIT_STRING_to_uint32(&sib2->ac_BarringForCSFB_r10->ac_BarringForSpecialAC) ); + BIT_STRING_to_uint32(&sib2->ext2->ac_BarringForCSFB_r10->ac_BarringForSpecialAC) ); } else LOG_I( RRC, "ac_BarringForCSFB_r10 : not defined\n" ); @@ -3143,12 +3143,12 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) } } #ifdef Rel10 - if (ifcfInfo->q_QualMin_r9) - LOG_I(RRC," Q_QualMin_r9 : %d\n",*ifcfInfo->q_QualMin_r9); + if (ifcfInfo->ext1 && ifcfInfo->ext1->q_QualMin_r9) + LOG_I(RRC," Q_QualMin_r9 : %d\n",*ifcfInfo->ext1->q_QualMin_r9); - if (ifcfInfo->threshX_Q_r9) { - LOG_I(RRC," threshX_HighQ_r9 : %d\n",ifcfInfo->threshX_Q_r9->threshX_HighQ_r9); - LOG_I(RRC," threshX_LowQ_r9: %d\n",ifcfInfo->threshX_Q_r9->threshX_LowQ_r9); + if (ifcfInfo->ext1 && ifcfInfo->ext1->threshX_Q_r9) { + LOG_I(RRC," threshX_HighQ_r9 : %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_HighQ_r9); + LOG_I(RRC," threshX_LowQ_r9: %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_LowQ_r9); } #endif } diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 1f21216fd8..bc73873719 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1268,7 +1268,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( #ifdef Rel10 sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long)); *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR - mac_MainConfig->sr_ProhibitTimer_r9 = sr_ProhibitTimer_r9; + mac_MainConfig->ext1 = CALLOC(1, sizeof(struct MAC_MainConfig__ext1)); + mac_MainConfig->ext1->sr_ProhibitTimer_r9 = sr_ProhibitTimer_r9; //sps_RA_ConfigList_rlola = NULL; #endif @@ -2408,7 +2409,8 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( #ifdef Rel10 sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long)); *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR - mac_MainConfig->sr_ProhibitTimer_r9 = sr_ProhibitTimer_r9; + mac_MainConfig->ext1 = CALLOC(1, sizeof(struct MAC_MainConfig__ext1)); + mac_MainConfig->ext1->sr_ProhibitTimer_r9 = sr_ProhibitTimer_r9; //sps_RA_ConfigList_rlola = NULL; #endif // Measurement ID list